利用fork,创建多个子进程服务客户,这就是多进程编程的本质 。并发服务端编写框架如下:
server_socket = socket()
bind(server_socket,... )
listen(server_socket, 5)
while (1)
{
confd = accept(server_socket, );
pid_t pid = fork();
if (pid == 0) { // 子进程
close(server_socket);
do_something(connfd); // read or write
close(connfd);
exit(0);
} else if (pid == -1) { // error
} else { // 父进程
close(connfd);
}
}
close(server_socket);
第1~7行仍旧按照之前的编写方法
- 创建socket
- 利用bind绑定地址
- 利用listen进行监听
- 利用accept接受客户端连接
第9行利用fork一个子进程,当pid=0,说明这是一个子进程。
第10行表示子进程关闭监听socket(即server_socket) ,第17行表示父进程关闭已连接socket(即connfd)。 原理如下:
- 当一个客户端连接服务端时,accept函数返回connfd套接字。
- 利用fork函数创建一个子进程,根据上一节可知,父进程相当于拷贝了自己,因此如下图所示,子进程也拥有server_socket以及connfd。 对于父进程而言,父进程不再需要connfd,因为子进程负责连接客户端,并做读写处理,因此第17行父进程需要关闭connfd。 对于子进程而言,子进程并不需要server_socket,因此第10行先关闭server_socket。
- 最终情形如下,父进程继续去监听新来的连接,子进程服务已连接的客户端。
第11~12行表示子进程利用connfd进行读写业务,完成后关闭connfd,结束本次连接。