2023年8月2日发(作者:)
【⽹络编程笔记三】多进程并发服务器简单例⼦实现⼀个多进程并发服务器,可以⽤多个客户端同时连接该服务端。服务端每连接也给客户端就创建⼀个⼦进程来处理,⽗进程则继续负责接收客户端的连接。#include
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条)