Modifiche al server di echo per introdurre le stampe di debugging e la
[gapil.git] / listati / TCP_echod.c
1 int main(int argc, char *argv[])
2 {
3     int list_fd, conn_fd; 
4     pid_t pid;
5     struct sockaddr_in serv_add;
6     ...
7     /* create socket */
8     if ( (list_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
9         perror("Socket creation error");
10         exit(1);
11     }
12     /* initialize address and bind socket */
13     memset((void *)&serv_add, 0, sizeof(serv_add)); /* clear server address */
14     serv_add.sin_family = AF_INET;                  /* address type is INET */
15     serv_add.sin_port = htons(7);                   /* echo port is 7 */
16     serv_add.sin_addr.s_addr = htonl(INADDR_ANY);   /* connect from anywhere */
17     if (bind(list_fd, (struct sockaddr *)&serv_add, sizeof(serv_add)) < 0) {
18         perror("bind error");
19         exit(1);
20     }
21     /* give away privileges and go daemon */
22     if (setgid(65534) !=0) { /* first give away group privileges */
23         perror("cannot give away group privileges");
24         exit(1);
25     }
26     if (setuid(65534) !=0) { /* and only after user ... */
27         perror("cannot give away user privileges");
28         exit(1);
29     }
30     if (demonize) {          /* go daemon */
31         openlog(argv[0], 0, LOG_DAEMON); /* open logging */
32         if (daemon(0, 0) != 0) {
33             perror("cannot start as daemon");
34             exit(1);
35         }
36     }
37     /* main body */
38     if (listen(list_fd, BACKLOG) < 0 ) { /* listen on socket */
39         PrintErr("listen error");
40         exit(1);
41     }
42     while (1) {                          /* handle echo to client */
43         if ( (conn_fd = accept(list_fd, NULL, NULL)) < 0) { 
44             PrintErr("accept error");
45             exit(1);
46         }
47         if ( (pid = fork()) < 0 ) {      /* fork to handle connection */
48             PrintErr("fork error");
49             exit(1);
50         }
51         if (pid == 0) {      /* child */
52             close(list_fd);          /* close listening socket */   
53             ServEcho(conn_fd);       /* handle echo */
54             exit(0);
55         } else {             /* parent */
56             close(conn_fd);          /* close connected socket */
57         }
58     }
59     exit(0);     /* normal exit, never reached */
60 }