#include #include #include #include #include #include #include #include #include #include #include static void dump(const char *s, size_t len) { while (len--) { char t = *s++; if (' ' <= t && t <= '~' && t != '\\') printf("%c", t); else printf("\\%o", t & 0xff); } printf("\n"); } int main(int argc, char *argv[]) { int sock, rv, n; const char req[] = "\202\254\1\0\0\1\0\0\0\0\0\0\7example\3com\0\0\1\0\1"; struct timespec delay_l = { 1, 0 }; /* 1 sec */ struct pollfd pfs; struct sockaddr_in me = { 0 }; sock = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, IPPROTO_IP); assert(sock >= 0); me.sin_family = AF_INET; me.sin_port = 0; me.sin_addr.s_addr = inet_addr("0.0.0.0"); rv = bind(sock, (struct sockaddr *) &me, sizeof me); assert(0 == rv); for (n = 1; n < argc; n++) { if (0 == strcmp("delay", argv[n])) { struct timespec delay_s = { 0, (1 << 24) }; /* ~ 16 msec */ nanosleep(&delay_s, NULL); } else { struct sockaddr_in dst = { 0 }; dst.sin_family = AF_INET; dst.sin_port = htons(53); dst.sin_addr.s_addr = inet_addr(argv[n]); rv = sendto(sock, req, sizeof req - 1, MSG_NOSIGNAL, (struct sockaddr *) &dst, sizeof dst); assert(rv >= 0); } } nanosleep(&delay_l, NULL); pfs.fd = sock; pfs.events = POLLIN; rv = poll(&pfs, 1, 2000); printf("poll: %d %d %d\n", rv, pfs.events, pfs.revents); for (n = 1; n < argc; n++) { char resp[4000]; if (0 == strcmp("delay", argv[n])) continue; rv = recvfrom(sock, resp, sizeof resp, 0, NULL, NULL); printf("recvfrom() %d\n", rv); if (rv > 0) dump(resp, rv); } return 0; }