mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-01 05:52:32 +07:00
59 lines
2.0 KiB
C
59 lines
2.0 KiB
C
// Copyright (c) 2026 Cesanta Software Limited
|
|
// All rights reserved
|
|
|
|
#include "mongoose.h"
|
|
|
|
static char s_name[] = "Mongoose";
|
|
static char s_service[] = "_http._tcp";
|
|
|
|
static void mdns_ev_handler(struct mg_connection *c, int ev, void *ev_data) {
|
|
if (ev == MG_EV_MDNS_RESP) {
|
|
struct mg_mdns_resp *resp = (struct mg_mdns_resp *) ev_data;
|
|
if (resp->rr->atype == MG_DNS_RTYPE_PTR &&
|
|
mg_strcasecmp(mg_str(s_service), resp->sd.srvcproto) == 0) {
|
|
char addr[40];
|
|
MG_INFO(("Got a response"));
|
|
printf("\tSERVICE -> %.*s\n", (int) resp->sd.srvcproto.len,
|
|
resp->sd.srvcproto.buf);
|
|
printf("\tNAME -> %.*s\n", (int) resp->name.len, resp->name.buf);
|
|
if (resp->sd.port != 0)
|
|
printf("\tPORT -> %u\n", resp->sd.port);
|
|
if (resp->addr.addr.ip4 != 0) {
|
|
mg_snprintf(addr, sizeof(addr), "%M", mg_print_ip, &resp->addr);
|
|
printf("\tADDRESS -> %s\n", addr);
|
|
}
|
|
if (resp->sd.txt.buf != NULL)
|
|
printf("\tTXT -> %.*s\n", (int) resp->sd.txt.len, resp->sd.txt.buf);
|
|
if (resp->addr.addr.ip4 != 0 && resp->addr.port != 0) {
|
|
mg_snprintf(addr, sizeof(addr), "http://%M:%u", mg_print_ip, &resp->addr,
|
|
mg_ntohs(resp->addr.port));
|
|
printf("\tURL -> %s\n", addr);
|
|
} else if (resp->sd.port != 0 && resp->name.buf != NULL) {
|
|
printf("\tURL -> http://%.*s:%u\n", (int) resp->name.len,
|
|
resp->name.buf, resp->sd.port);
|
|
}
|
|
printf("\n");
|
|
}
|
|
}
|
|
(void) c;
|
|
}
|
|
|
|
int main(void) {
|
|
struct mg_mgr mgr;
|
|
char query[256];
|
|
static struct mg_connection *c;
|
|
mg_log_set(MG_LL_DEBUG); // Set log level
|
|
mg_mgr_init(&mgr); // Initialise event manager
|
|
|
|
c = mg_mdns_listen(&mgr, mdns_ev_handler, s_name); // Start mDNS server
|
|
if (c == NULL) return 1;
|
|
mg_snprintf(query, sizeof(query), "%s.local", s_service);
|
|
// Request service providers
|
|
if (!mg_mdns_query(c, query, MG_DNS_RTYPE_PTR)) return 1;
|
|
|
|
for (;;) mg_mgr_poll(&mgr, 1000); // Event loop
|
|
|
|
mg_mgr_free(&mgr);
|
|
return 0;
|
|
}
|