X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=listati%2FTCP_echod.c;fp=listati%2FTCP_echod.c;h=81085a7b5f59f831291723a6561475e6aaf624f5;hb=7444bbe1f4d1e9858693bfcb41921fa601450a89;hp=0000000000000000000000000000000000000000;hpb=626fee850ef998ab730a6da711494d6a5ace1be5;p=gapil.git diff --git a/listati/TCP_echod.c b/listati/TCP_echod.c new file mode 100644 index 0000000..81085a7 --- /dev/null +++ b/listati/TCP_echod.c @@ -0,0 +1,60 @@ +int main(int argc, char *argv[]) +{ + int list_fd, conn_fd; + pid_t pid; + struct sockaddr_in serv_add; + ... + /* create socket */ + if ( (list_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("Socket creation error"); + exit(1); + } + /* initialize address and bind socket */ + memset((void *)&serv_add, 0, sizeof(serv_add)); /* clear server address */ + serv_add.sin_family = AF_INET; /* address type is INET */ + serv_add.sin_port = htons(7); /* echo port is 7 */ + serv_add.sin_addr.s_addr = htonl(INADDR_ANY); /* connect from anywhere */ + if (bind(list_fd, (struct sockaddr *)&serv_add, sizeof(serv_add)) < 0) { + perror("bind error"); + exit(1); + } + /* give away privileges and go daemon */ + if (setgid(65534) !=0) { /* first give away group privileges */ + perror("cannot give away group privileges"); + exit(1); + } + if (setuid(65534) !=0) { /* and only after user ... */ + perror("cannot give away user privileges"); + exit(1); + } + if (demonize) { /* go daemon */ + openlog(argv[0], 0, LOG_DAEMON); /* open logging */ + if (daemon(0, 0) != 0) { + perror("cannot start as daemon"); + exit(1); + } + } + /* main body */ + if (listen(list_fd, BACKLOG) < 0 ) { /* listen on socket */ + PrintErr("listen error"); + exit(1); + } + while (1) { /* handle echo to client */ + if ( (conn_fd = accept(list_fd, NULL, NULL)) < 0) { + PrintErr("accept error"); + exit(1); + } + if ( (pid = fork()) < 0 ) { /* fork to handle connection */ + PrintErr("fork error"); + exit(1); + } + if (pid == 0) { /* child */ + close(list_fd); /* close listening socket */ + ServEcho(conn_fd); /* handle echo */ + exit(0); + } else { /* parent */ + close(conn_fd); /* close connected socket */ + } + } + exit(0); /* normal exit, never reached */ +}