#include #include #include #include #include #include #include #include #include #include #include #define PORT 23457 int main(int argc, char **argv) { struct sockaddr_in sin; int listenfd, connfd, pid, ret; char buf[100]; if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) err(1, "socket error"); memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(PORT); if (bind(listenfd, (struct sockaddr *) &sin, sizeof(sin)) < 0) err(1, "bind error"); if (listen(listenfd, 1024) < 0) err(1, "listen error"); pid = fork(); if (pid == -1) err(1, "fork error"); if (pid != 0) { close(listenfd); sleep(1); if ((connfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { (void)kill(pid, SIGTERM); err(1, "parent: socket error"); } if (connect(connfd, (struct sockaddr *)&sin, sizeof(sin)) < 0) { (void)kill(pid, SIGTERM); err(1, "parent: connect error"); } /* Make socket non-blocking. */ if (fcntl(connfd, F_SETFL, O_NONBLOCK) == -1) { (void)kill(pid, SIGTERM); err(1, "parent: fcntl error"); } sleep (1); /* Normally this should return 0. */ ret = recv(connfd, buf, sizeof(buf), 0); printf("parent: recv returned %d (errno = %d)\n", ret, errno); close(connfd); (void)kill(pid, SIGTERM); } else { if ((connfd = accept(listenfd, (struct sockaddr *)NULL, NULL)) < 0) { err(1, "child: accept error"); } if (close(connfd) < 0) err(1, "child: close error"); sleep(10); } exit(0); }