brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.3 KiB · 7d2eb4e Raw
75 lines · cpp
1// RUN: %clangxx -O0 -g %s -o %t && %run %t2 3#include <netinet/in.h>4#include <sys/socket.h>5#include <sys/wait.h>6#include <signal.h>7#include <stdlib.h>8#include <unistd.h>9 10int main(void) {11  int child;12  int fd, sfd;13  socklen_t len;14  struct sockaddr_in server = {}, client = {};15  sigset_t set;16 17  child = fork();18  if (child == 0) {19    fd = socket(AF_INET, SOCK_STREAM, 0);20    if (fd == -1)21      _exit(1);22 23    server.sin_family = AF_INET;24    server.sin_addr.s_addr = INADDR_ANY;25    server.sin_port = htons(2222);26 27    if (connect(fd, (struct sockaddr *)&server, sizeof(server)) == -1)28      _exit(1);29 30    close(fd);31 32    _exit(0);33  }34 35  fd = socket(AF_INET, SOCK_STREAM, 0);36  if (fd == -1) {37    kill(child, SIGKILL);38    wait(NULL);39    exit(1);40  }41 42  server.sin_family = AF_INET;43  server.sin_addr.s_addr = INADDR_ANY;44  server.sin_port = htons(2222);45 46  if (bind(fd, (const struct sockaddr *)&server, sizeof(server)) == -1) {47    kill(child, SIGKILL);48    wait(NULL);49    exit(1);50  }51 52  listen(fd, 3);53 54  if (sigemptyset(&set) == -1) {55    kill(child, SIGKILL);56    wait(NULL);57    exit(1);58  }59 60  len = sizeof(client);61  sfd = paccept(fd, (struct sockaddr *)&client, &len, &set, SOCK_NONBLOCK);62  if (sfd == -1) {63    kill(child, SIGKILL);64    wait(NULL);65    exit(1);66  }67 68  wait(NULL);69 70  close(sfd);71  close(fd);72 73  return 0;74}75