// RUN: %clangxx -O0 -g %s -o %t && %run %t #include #include #include #include #include #include int main(void) { int child; int fd, sfd; socklen_t len; struct sockaddr_in server = {}, client = {}; sigset_t set; child = fork(); if (child == 0) { fd = socket(AF_INET, SOCK_STREAM, 0); if (fd == -1) _exit(1); server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(2222); if (connect(fd, (struct sockaddr *)&server, sizeof(server)) == -1) _exit(1); close(fd); _exit(0); } fd = socket(AF_INET, SOCK_STREAM, 0); if (fd == -1) { kill(child, SIGKILL); wait(NULL); exit(1); } server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(2222); if (bind(fd, (const struct sockaddr *)&server, sizeof(server)) == -1) { kill(child, SIGKILL); wait(NULL); exit(1); } listen(fd, 3); if (sigemptyset(&set) == -1) { kill(child, SIGKILL); wait(NULL); exit(1); } len = sizeof(client); sfd = paccept(fd, (struct sockaddr *)&client, &len, &set, SOCK_NONBLOCK); if (sfd == -1) { kill(child, SIGKILL); wait(NULL); exit(1); } wait(NULL); close(sfd); close(fd); return 0; }