2 #include <sys/socket.h>
3 #include <netinet/in.h>
10 int ans(mdnsda a, void *arg)
13 if(a->ttl == 0) now = 0;
14 else now = a->ttl - time(0);
18 printf("A %s for %d seconds to ip %s\n",a->name,now,inet_ntoa(a->ip));
21 printf("PTR %s for %d seconds to %s\n",a->name,now,a->rdname);
24 printf("SRV %s for %d seconds to %s:%d\n",a->name,now,a->rdname,a->srv.port);
27 printf("%d %s for %d seconds with %d data\n",a->type,a->name,now,a->rdlen);
31 // create multicast 224.0.0.251:5353 socket
34 int s, flag = 1, ittl = 255;
35 struct sockaddr_in in;
39 bzero(&in, sizeof(in));
40 in.sin_family = AF_INET;
41 in.sin_port = htons(5353);
42 in.sin_addr.s_addr = 0;
44 if((s = socket(AF_INET,SOCK_DGRAM,0)) < 0) return 0;
46 setsockopt(s, SOL_SOCKET, SO_REUSEPORT, (char*)&flag, sizeof(flag));
48 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, sizeof(flag));
49 if(bind(s,(struct sockaddr*)&in,sizeof(in))) { close(s); return 0; }
51 mc.imr_multiaddr.s_addr = inet_addr("224.0.0.251");
52 mc.imr_interface.s_addr = htonl(INADDR_ANY);
53 setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mc, sizeof(mc));
54 setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
55 setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &ittl, sizeof(ittl));
57 flag = fcntl(s, F_GETFL, 0);
59 fcntl(s, F_SETFL, flag);
64 int main(int argc, char *argv[])
69 unsigned short int port;
71 int bsize, ssize = sizeof(struct sockaddr_in);
72 unsigned char buf[MAX_PACKET_LEN];
73 struct sockaddr_in from, to;
77 if(argc != 3) { printf("usage: mquery 12 _http._tcp.local.\n"); return; }
79 d = mdnsd_new(1,1000);
80 if((s = msock()) == 0) { printf("can't create socket: %s\n",strerror(errno)); return 1; }
82 mdnsd_query(d,argv[2],atoi(argv[1]),ans,0);
89 select(s+1,&fds,0,0,tv);
93 while((bsize = recvfrom(s,buf,MAX_PACKET_LEN,0,(struct sockaddr*)&from,&ssize)) > 0)
95 bzero(&m,sizeof(struct message));
96 message_parse(&m,buf);
97 mdnsd_in(d,&m,(unsigned long int)from.sin_addr.s_addr,from.sin_port);
99 if(bsize < 0 && errno != EAGAIN) { printf("can't read from socket %d: %s\n",errno,strerror(errno)); return 1; }
101 while(mdnsd_out(d,&m,&ip,&port))
103 bzero(&to, sizeof(to));
104 to.sin_family = AF_INET;
106 to.sin_addr.s_addr = ip;
107 if(sendto(s,message_packet(&m),message_packet_len(&m),0,(struct sockaddr *)&to,sizeof(struct sockaddr_in)) != message_packet_len(&m)) { printf("can't write to socket: %s\n",strerror(errno)); return 1; }