1、多进程实现TCP并发
//定义信号处理函数 void handler(int signo) { if(signo == SIGCHLD) { // 回收所有的僵尸进程 while(waitpid(-1, NULL, WNOHANG) != 0); } } int main(){ //将SIGCHLD信号绑定到信号处理函数中 signal(SIGCHLD, handler); sfd = socket(); //创建用于通信的套接字文件描述符 bind(); //绑定ip地址和端口号 listen(); //将套接字设置成被动监听状态 while(1) { newfd = accept(); //阻塞等待客户端连接请求,并为其创建一个新的用于通信的套接字问津描述符 pid = fork(); //创建子进程用于处理客户端 if(pid > 0) { //父进程 close(newfd); }elseif(pid == 0) { // 子进程 //跟当前客户端进行通信 close(sfd); //关闭sfd recv(); //阻塞读取消息 send(); //发送消息 close(newfd); //关闭套接字 exit(); //退出进程 } } close(sfd); //关闭监听 return 0; }
2、多线程实现TCP并发
//定义线程体函数 void *deal_cli_msg(void *arg) { //跟当前客户端进行通信 recv(); //阻塞读取消息 send(); //发送消息 close(newfd); //关闭套接字 pthread_exit(NULL); //退出线程 } int main(){ sfd = socket(); //创建用于通信的套接字文件描述符 bind(); //绑定ip地址和端口号 listen(); //将套接字设置成被动监听状态 while(1) { newfd = accept(); //阻塞等待客户端连接请求,并为其创建一个新的用于通信的套接字问津描述符 pthread_create(&tid, NULL, deal_cli_msg, &info); //创建分支线程用于跟客户端进行通信 pthread_detach(tid); //将线程设置成分离态 } close(sfd); //关闭监听 return 0; }