fdleak_ipv4.c revision ed07e00d438c74b7a23c01bfffde77e3968305e4
1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <sys/types.h> 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <sys/wait.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <sys/socket.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <netinet/in.h> 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <arpa/inet.h> 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <fcntl.h> 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <unistd.h> 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <string.h> 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "fdleak.h" 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid server () 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int s, x; 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct sockaddr_in baddr; 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct sockaddr_in addr; 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown socklen_t baddrsize = sizeof(baddr); 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int one = 1; 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown s = DO( socket(PF_INET, SOCK_STREAM, 0) ); 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DO( setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int)) ); 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown memset(&addr, 0, sizeof(addr)); 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addr.sin_family = AF_INET; 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addr.sin_port = htons(12321); 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DO( bind(s, (struct sockaddr *)&addr, sizeof(addr)) ); 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DO( listen(s, 5) ); 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown memset(&baddr, 0, sizeof(baddr)); 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown x = DO( accept(s, (struct sockaddr *)&baddr, &baddrsize) ); 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DO( write(x, "hello", 6) ); 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid client () 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int s, count = 0, ret; 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct sockaddr_in addr; 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char buf[1024]; 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addr.sin_family = AF_INET; 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addr.sin_port = htons(12321); 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do { 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown count++; 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown s = DO( socket(PF_INET, SOCK_STREAM, 0) ); 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ret = connect(s, (struct sockaddr *)&addr, sizeof(addr)); 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ret == -1) { 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // If the connect() failed, we close the socket and reopen it before 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // trying again. This isn't necessary on Linux, but it is on Darwin. 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DO( close(s) ); 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sleep(1); 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } while (count < 10 && ret == -1); 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (ret == -1) { 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown perror("connect"); 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DO( read(s, buf, sizeof(buf)) ); 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("%s\n", buf); 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main (int argc, char **argv) 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int pid, status; 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CLOSE_INHERITED_FDS; 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((pid = fork()) == 0) { 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown server(); 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown client(); 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown wait(&status); 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 89