#include #include #include #include #include #include #include /* How many UDP packets to send to a non-responding part. */ enum { ITERATIONS = 1000 }; int main (void) { /* Pick a port number which is likely unused. */ unsigned short port; { int sock = socket (AF_INET, SOCK_DGRAM, 0); if (sock < 0) err (1, "socket"); struct sockaddr_in sin = { .sin_family = AF_INET }; if (bind (sock, (struct sockaddr *) &sin, sizeof (sin)) < 0) err (1, "bind"); socklen_t sinlen = sizeof (sin); if (getsockname (sock, (struct sockaddr *) &sin, &sinlen)) err (1, "getsockname"); if (sinlen != sizeof (sin) || sin.sin_family != AF_INET) errx (1, "wrong address information for socket"); if (close (sock) < 0) err (1, "close"); port = sin.sin_port; } for (int i = 0; i < ITERATIONS; ++i) { int sock = socket (AF_INET, SOCK_DGRAM, 0); if (sock < 0) err (1, "socket"); struct sockaddr_in sin = { .sin_family = AF_INET, .sin_addr = { ntohl (INADDR_LOOPBACK) }, .sin_port = port, }; if (connect (sock, (struct sockaddr *) &sin, sizeof (sin)) < 0) err (1, "connect"); if (sendto (sock, "", 1, 0, NULL, 0) < 0) err (1, "sendto"); struct pollfd fd = { .fd = sock, .events = POLLIN }; int ret = poll (&fd, 1, 5000); if (ret < 0) err (1, "poll"); if (ret == 0) errx (1, "iteration %d: no ICMP message (poll timeout)", i); if (close (sock) < 0) err (1, "close"); } }