1 #include <err.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <sysexits.h> 5 #include <netinet/in.h> 6 #include <sys/select.h> 7 #include <sys/socket.h> 8 #include <sys/types.h> 9 10 int 11 main(int argc, char *argv[]) 12 { 13 struct sockaddr_in sa_local, sa_remote; 14 socklen_t sin_size = sizeof(struct sockaddr_in); 15 fd_set exceptfds; 16 struct timeval timeout; 17 int fd_l, fd_c, fd_n, i; 18 19 if ((fd_l = socket(PF_INET, SOCK_STREAM, 0)) == -1) 20 err(EX_OSERR, "socket(2) failure"); 21 22 if ((fd_c = socket(PF_INET, SOCK_STREAM, 0)) == -1) 23 err(EX_OSERR, "socket(2) failure"); 24 25 sa_local.sin_family = AF_INET; 26 sa_local.sin_port = 0; 27 sa_local.sin_addr.s_addr = htonl(INADDR_ANY); 28 memset(&(sa_local.sin_zero), 0, sizeof(sa_local.sin_zero)); 29 30 if (bind(fd_l, (struct sockaddr *)&sa_local, sizeof(struct sockaddr)) == -1) 31 err(EX_OSERR, "bind(2) failure"); 32 33 if (getsockname(fd_l, (struct sockaddr *)&sa_local, &sin_size) == -1) 34 err(EX_OSERR, "getsockname(2) failure"); 35 36 if (listen(fd_l, 1) == -1) 37 err(EX_OSERR, "listen(2) failure"); 38 39 if (connect(fd_c, (struct sockaddr *)&sa_local, sizeof(struct sockaddr)) == -1) 40 err(EX_OSERR, "connect(2) failure"); 41 42 fd_n = accept(fd_l, (struct sockaddr *)&sa_remote, &sin_size); 43 44 FD_ZERO(&exceptfds); 45 FD_SET(fd_n, &exceptfds); 46 47 if (send(fd_c, "x", 1, MSG_OOB) == -1) 48 err(EX_OSERR, "send(2) failure"); 49 50 memset(&timeout, 0, sizeof(timeout)); 51 i = select(fd_n+1, NULL, NULL, &exceptfds, &timeout); 52 53 if (i == 1) 54 printf("ok\n"); 55 56 return (0); 57 } 58