【网络编程笔记三】多进程并发服务器简单例子

【网络编程笔记三】多进程并发服务器简单例子

2023年8月2日发(作者:)

【⽹络编程笔记三】多进程并发服务器简单例⼦实现⼀个多进程并发服务器,可以⽤多个客户端同时连接该服务端。服务端每连接也给客户端就创建⼀个⼦进程来处理,⽗进程则继续负责接收客户端的连接。#include #include #include #include #include #include #include #define SERV_PORT 8888/**************************************************⽗进程收到⼦进程结束的信号时,等待while循环等待⼦进程结束waitpid参数⼆:pid=0:等待进程组识别码与⽬前进程相同的任何⼦进程。waitpid参数三:WNOHANG:若pid指定的⼦进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该⼦进程的ID**************************************************/void wait_child(int signo){ while (waitpid(0, NULL, WNOHANG) > 0); return;}int main(void){ pid_t pid; int sfd, cfd; struct sockaddr_in serv_addr, clie_addr; socklen_t clie_addr_len; char buf[BUFSIZ], clie_IP[BUFSIZ]; int n,i;

sfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&serv_addr, sizeof(serv_addr)); serv__family = AF_INET; serv__port = htons(SERV_PORT); serv__addr.s_addr = htonl(INADDR_ANY); bind(sfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); listen(sfd, 128);

/*⽗进程不断的给⾃⼰“揽活”,即循环等待⼦进程的连接*/ while(1) { clie_addr_len = sizeof(clie_addr); cfd = accept(sfd, (struct sockaddr *)&clie_addr, &clie_addr_len); printf("client IP:%s, port:%dn", inet_ntop(AF_INET, &clie__addr.s_addr, clie_IP, sizeof(clie_IP)), ntohs(clie__port)); /*连接成功后,创建⼦进程来处理和刚连接的客户端通信的事情,然后⽗进程继续负责接收其他⼦进程的连接*/ pid = fork(); if (pid < 0) { perror("fork error"); exit(1); } else if(pid == 0)//⼦进程关闭当前服务端套接字,然后跳出去循环去处理和客户端之间⼯作 { close(sfd); break; } else//⽗进程关闭连接套接字,等待⼦进程结束,回收僵⼫进程 { close(cfd); signal(SIGCHLD, wait_child);//SIGCHLD:在⼀个进程终⽌或者停⽌时,将SIGCHLD信号发送给其⽗进程 } }

/*⼦进程负责通信的内容部分*/ if (pid == 0) { while (1) { n = read(cfd, buf, sizeof(buf));//read读套接字时,读到返回值为0则说明对端(客户端)关闭 if (n == 0) { close(cfd); return 0; } else if (n == -1) { perror("read error"); exit(1); } else { for(i = 0; i < n; i++) buf[i] = toupper(buf[i]); write(cfd, buf, n); write(STDOUT_FILENO, buf, n); }

} } return 0;}执⾏结果:

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690955723a472422.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信