Linux网络编程入门 互动版

利用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)。 原理如下:

  1. 当一个客户端连接服务端时,accept函数返回connfd套接字。 12
  2. 利用fork函数创建一个子进程,根据上一节可知,父进程相当于拷贝了自己,因此如下图所示,子进程也拥有server_socket以及connfd。 对于父进程而言,父进程不再需要connfd,因为子进程负责连接客户端,并做读写处理,因此第17行父进程需要关闭connfd。 对于子进程而言,子进程并不需要server_socket,因此第10行先关闭server_socket。 13
  3. 最终情形如下,父进程继续去监听新来的连接,子进程服务已连接的客户端。 14

第11~12行表示子进程利用connfd进行读写业务,完成后关闭connfd,结束本次连接。