ECHO Server

尝试了一下在主进程只fork,香港虚拟主机,香港服务器租用,子进程accept的结构,香港服务器,由于是测试用的小例子所以限定了用户数量为5个。

1 #include <unistd.h> 2 #include <pthread.h> 3 #include <sys/wait.h> 4 #include <sys/socket.h> 5 #include <netinet/in.h> 6 #include <arpa/inet.h> 7 #include <signal.h> 8 #include <errno.h> 9 #include <stdlib.h> 10 #include <stdio.h> 11 #include <string.h>USERNUM 5 14 #define SERVPORT 4322rep_err(const char *msg) 18 {, msg);); 21exit(-1); 22 }dealchild(int signo) 27 { 28 pid_t pid; 29int stat; 30while((pid = waitpid(-1, &stat, WNOHANG)) > 0);, pid); 32return; 33 }dofork(int); 36 37 pthread_mutex_t MUTEX = PTHREAD_MUTEX_INITIALIZER;main(int argc, char *argv[]) 41 { 42intlistenfd, err, i; 43 pid_tpid; 44struct sockaddr_in servaddr;(signal(SIGCHLD, dealchild) == SIG_ERR));((listenfd = socket(AF_INET, SOCK_STREAM, 0)) <= 0)); 51 52memset(&servaddr, 0, sizeof(servaddr)); 53servaddr.sin_family = AF_INET; 54servaddr.sin_port = htons(SERVPORT); 55servaddr.sin_addr.s_addr = htonl(INADDR_ANY);((err = bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr))) < 0));((err = listen(listenfd, 128)) < 0));(i = 0; i < USERNUM; ++i) 64 { 65if((pid = fork()) == 0) 66 { 67 dofork(listenfd); 68 }(pid > 0) 70 {}rep_err(); 73 } 74 75 pause(); 76 77exit(0); 78 }dofork(int fd) 82 { 83intconnfd, n; 84charbuffer[256]; 85charbuf[128]; 86struct sockaddr_in cli; 87 socklen_tclilen; 88 89clilen = sizeof(cli); 90pthread_mutex_lock(&MUTEX); 91if((connfd = accept(fd, (struct sockaddr *)&cli, &clilen)) <= 0)); 93pthread_mutex_unlock(&MUTEX); 94 95snprintf(buffer, 256,, 97inet_ntop(AF_INET, &cli.sin_addr, buf, 128), 98 ntohs(cli.sin_port)); 99 100 write(connfd, buffer, strlen(buffer));(;;)103 {104 again:105if((n = read(connfd, buffer, 256)) < 0)106 {107if(errno == EINTR)108goto again;rep_err();111 }112 write(connfd, buffer, n);113 }114 }呼唤你前往另一个地方,过上另一种生活。

ECHO Server

相关文章:

你感兴趣的文章:

标签云: