#include #include #include #include #include #define N 1000 int ports[N], listen_port = 1234; /* find duplicate ports and show distance between them */ int analyze(void) { int i, j, n = 0; for(i = 0; i < N; i++) { for(j = i + 1; j < N; j++) { if (ports[i] != ports[j]) continue; printf(" port reused: %d: distance %d (%d,%d)\n", ports[i], j-i, j, i); n++; } } printf("%d ports were being reused\n", n); return 0; } int client(void) { int sock, i = 0; size_t tmp; struct sockaddr_in addr_bind = { .sin_family = AF_INET, .sin_addr.s_addr = INADDR_ANY, .sin_port = 0, }, addr_connect = { .sin_family = AF_INET, .sin_addr.s_addr = htonl(0x7f000001), .sin_port = htons(listen_port), }, addr_sockname; sleep(1); loop: sock = socket(AF_INET, SOCK_STREAM, 0); if (!sock) { perror("client: failed to create socket"); return -1; } if (bind(sock, (struct sockaddr*)&addr_bind, sizeof(addr_bind)) < 0) { perror("client: failed to bind"); return -1; } tmp = sizeof(addr_sockname); if (getsockname(sock, (struct sockaddr*)&addr_sockname, &tmp) < 0) { perror("client: getsockname failed"); return -1; } ports[i] = ntohs(addr_sockname.sin_port); if (connect(sock, (struct sockaddr*)&addr_connect, sizeof(addr_connect)) < 0) { perror("client: failed to connect"); return -1; } if (read(sock, &tmp, sizeof(tmp)) != 0) { perror("read failed"); return -1; } close(sock); if (++i < N) goto loop; return analyze(); } int server(void) { int sock = socket(AF_INET, SOCK_STREAM, 0), sock2; struct sockaddr_in addr = { .sin_family = AF_INET, .sin_addr.s_addr = INADDR_ANY, }; again: addr.sin_port = htons(listen_port); if (!sock) { perror("server: failed to create socket"); return -1; } if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("server: failed to bind"); listen_port++; goto again; } if (listen(sock, 128) < 0) { perror("server: failed to listen"); return -1; } printf("listening (port %d)\n", listen_port); switch (fork()) { case -1: return -1; case 0: return client(); } loop: sock2 = accept(sock, NULL, NULL); if (sock2 < 0) { perror("server: accept failed\n"); return -1; } close(sock2); goto loop; } int main() { return server(); }