int main(int argc, char *argv[]) { mdnsd d; struct message m; unsigned long int ip; unsigned short int port; struct timeval *tv; int bsize, ssize = sizeof(struct sockaddr_in); unsigned char buf[MAX_PACKET_LEN]; struct sockaddr_in from, to; fd_set fds; int s; if(argc != 3) { printf("usage: mquery 12 _http._tcp.local.\n"); return; } d = mdnsd_new(1,1000); if((s = msock()) == 0) { printf("can't create socket: %s\n",strerror(errno)); return 1; } mdnsd_query(d,argv[2],atoi(argv[1]),ans,0); while(1) { tv = mdnsd_sleep(d); FD_ZERO(&fds); FD_SET(s,&fds); select(s+1,&fds,0,0,tv); if(FD_ISSET(s,&fds)) { while((bsize = recvfrom(s,buf,MAX_PACKET_LEN,0,(struct sockaddr*)&from,&ssize)) > 0) { bzero(&m,sizeof(struct message)); message_parse(&m,buf); mdnsd_in(d,&m,(unsigned long int)from.sin_addr.s_addr,from.sin_port); } if(bsize < 0 && errno != EAGAIN) { printf("can't read from socket %d: %s\n",errno,strerror(errno)); return 1; } } while(mdnsd_out(d,&m,&ip,&port)) { bzero(&to, sizeof(to)); to.sin_family = AF_INET; to.sin_port = port; to.sin_addr.s_addr = ip; 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; } } } mdnsd_shutdown(d); mdnsd_free(d); return 0; }
static void server_loop(TestInstanceServer *inc) { struct message m; struct timeval *tv; MDDSocketAddr_t to_addr, from_addr; MDDIface_t to_iface, from_iface; MDDFDSet_t fds; mdnsd mdnsd; MDDSocket_t socket_ipv4; int rsize = 0; unsigned char buf[MAX_PACKET_LEN] = {0}; mdnsd = inc->mdnsd; socket_ipv4 = inc->socket_ipv4; while (1) { tv = mdnsd_sleep(mdnsd); MDDFDUtil_FDZero(&fds); MDDFDUtil_FDSet(socket_ipv4, &fds); MDDFDUtil_FDSelect(socket_ipv4 + 1, &fds, 0, 0, tv); // handle incoming packet if (MDDFDUtil_FDIsset(socket_ipv4, &fds)) { from_addr.family = MDDNet_INET; while ((rsize = MDDSocket_Recvfrom(socket_ipv4, buf, MAX_PACKET_LEN, &from_addr, &from_iface)) > 0) { memset(&m, 0, sizeof(struct message)); message_parse(&m, buf, rsize); mdnsd_in(inc->mdnsd, &m, &from_addr, &from_iface); } } // handle outgoing packet memset(&m, 0, sizeof(struct message)); while (mdnsd_out(mdnsd, &m, &to_addr, &to_iface)) { if (to_addr.family == MDDNet_INET) { if (MDDSocket_Sendto(socket_ipv4, message_packet(&m), message_packet_len(&m), &to_addr, &to_iface) != message_packet_len(&m)) { printf("can't write to ipv4 socket, ifindex: %u\n", to_iface.ifindex); } } else { printf("error when send packet, unsupport address family: %d\n", to_addr.family); } } if (inc->sn > inc->max_sn) { break; } } }
bool ScanThread::sendm(struct message* m, SOCKET s, unsigned long int ip, unsigned short int port) { struct sockaddr_in to; memset(&to, '\0', sizeof(to)); to.sin_family = AF_INET; to.sin_port = port; to.sin_addr.s_addr = ip; if(sendto(s, (char*)message_packet(m), message_packet_len(m), 0,(struct sockaddr *)&to,sizeof(struct sockaddr_in)) != message_packet_len(m)) { p->err.Printf(_("Can't write to socket: %s\n"),strerror(errno)); return false; } return true; }
int main(int argc, char *argv[]) { mdnsd d; mdnsdr r; struct message m; unsigned long int ip; unsigned short int port; struct timeval *tv; int bsize, ssize = sizeof(struct sockaddr_in); unsigned char buf[MAX_PACKET_LEN]; struct sockaddr_in from, to; fd_set fds; int s; unsigned char *packet, hlocal[256], nlocal[256]; int len = 0; xht h; if(argc < 4) { printf("usage: mhttp 'unique name' 12.34.56.78 80 '/optionalpath'\n"); return; } ip = inet_addr(argv[2]); port = atoi(argv[3]); printf("Announcing .local site named '%s' to %s:%d and extra path '%s'\n",argv[1],inet_ntoa(ip),port,argv[4]); signal(SIGINT,done); signal(SIGHUP,done); signal(SIGQUIT,done); signal(SIGTERM,done); pipe(_zzz); _d = d = mdnsd_new(1,1000); if((s = msock()) == 0) { printf("can't create socket: %s\n",strerror(errno)); return 1; } sprintf(hlocal,"%s._http._tcp.local.",argv[1]); sprintf(nlocal,"http-%s.local.",argv[1]); r = mdnsd_shared(d,"_http._tcp.local.",QTYPE_PTR,120); mdnsd_set_host(d,r,hlocal); r = mdnsd_unique(d,hlocal,QTYPE_SRV,600,con,0); mdnsd_set_srv(d,r,0,0,port,nlocal); r = mdnsd_unique(d,nlocal,QTYPE_A,600,con,0); mdnsd_set_raw(d,r,(unsigned char *)&ip,4); r = mdnsd_unique(d,hlocal,16,600,con,0); h = xht_new(11); if(argc == 5 && argv[4] && strlen(argv[4]) > 0) xht_set(h,"path",argv[4]); packet = sd2txt(h, &len); xht_free(h); mdnsd_set_raw(d,r,packet,len); free(packet); while(1) { tv = mdnsd_sleep(d); FD_ZERO(&fds); FD_SET(_zzz[0],&fds); FD_SET(s,&fds); select(s+1,&fds,0,0,tv); // only used when we wake-up from a signal, shutting down if(FD_ISSET(_zzz[0],&fds)) read(_zzz[0],buf,MAX_PACKET_LEN); if(FD_ISSET(s,&fds)) { while((bsize = recvfrom(s,buf,MAX_PACKET_LEN,0,(struct sockaddr*)&from,&ssize)) > 0) { bzero(&m,sizeof(struct message)); message_parse(&m,buf); mdnsd_in(d,&m,(unsigned long int)from.sin_addr.s_addr,from.sin_port); } if(bsize < 0 && errno != EAGAIN) { printf("can't read from socket %d: %s\n",errno,strerror(errno)); return 1; } } while(mdnsd_out(d,&m,&ip,&port)) { bzero(&to, sizeof(to)); to.sin_family = AF_INET; to.sin_port = port; to.sin_addr.s_addr = ip; 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; } } if(_shutdown) break; } mdnsd_shutdown(d); mdnsd_free(d); return 0; }