高埗网站建设公司,ftp备份网站,北京seo的排名优化,做神马网站优化有几个请求服务的客户端#xff0c;我们就创建几个子进程。
这个过程有以下三个阶段#xff1a; 这里父进程传递的套接字文件描述符#xff0c;实际上不需要传递#xff0c;因为子进程会复制父进程拥有的所有资源。
#include stdio.h
#include stdlib.h…有几个请求服务的客户端我们就创建几个子进程。
这个过程有以下三个阶段 这里父进程传递的套接字文件描述符实际上不需要传递因为子进程会复制父进程拥有的所有资源。
#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include signal.h
#include sys/wait.h
#include arpa/inet.h
#include sys/socket.h#define BUF_SIZE 30
void error_handling(char *message);
void read_childproc(int sig);int main(int argc, char *argv[])
{int serv_sock, clnt_sock;struct sockaddr_in serv_adr, clnt_adr;pid_t pid;struct sigaction act;socklen_t adr_sz;int str_len, state;char buf[BUF_SIZE];if(argc!2) {printf(Usage : %s port\n, argv[0]);exit(1);}act.sa_handlerread_childproc;sigemptyset(act.sa_mask);act.sa_flags0;statesigaction(SIGCHLD, act, 0);serv_socksocket(PF_INET, SOCK_STREAM, 0);memset(serv_adr, 0, sizeof(serv_adr));serv_adr.sin_familyAF_INET;serv_adr.sin_addr.s_addrhtonl(INADDR_ANY);serv_adr.sin_porthtons(atoi(argv[1]));if(bind(serv_sock, (struct sockaddr*) serv_adr, sizeof(serv_adr))-1)error_handling(bind() error);if(listen(serv_sock, 5)-1)error_handling(listen() error);while(1){adr_szsizeof(clnt_adr);//因为父进程调用accept()受理连接请求所以创建子进程在后。clnt_sockaccept(serv_sock, (struct sockaddr*)clnt_adr, adr_sz);if(clnt_sock-1)continue;elseputs(new client connected...);pidfork();if(pid-1)//创建子进程失败{close(clnt_sock);continue;}if(pid0)//子进程{close(serv_sock);//关闭服务端的原因下面会解释while((str_lenread(clnt_sock, buf, BUF_SIZE))!0)write(clnt_sock, buf, str_len);close(clnt_sock);puts(client disconnected...);return 0;}else//父进程close(clnt_sock);//套接字已经复制给子进程所以销毁即可}close(serv_sock);return 0;
}void read_childproc(int sig)
{pid_t pid;int status;pidwaitpid(-1, status, WNOHANG);printf(removed proc id: %d \n, pid);
}
void error_handling(char *message)
{fputs(message, stderr);fputc(\n, stderr);exit(1);
}
上述代码是基于多进程实现的并发回声服务器。
解释为什么子进程可以关闭服务端套接字
在上述代码中子进程需要关闭服务端套接字的原因是服务端套接字已经在父进程中被创建并绑定到了指定的地址和端口而子进程继承了父进程的所有资源包括服务端套接字。如果子进程不关闭服务端套接字将会导致服务端套接字被重复绑定从而引发错误。另外子进程只需要处理与客户端的通信不需要再监听客户端的连接请求因此关闭服务端套接字对子进程的功能没有影响。