父进程需要关闭
acceptfd
(确保acceptfd
的引用计数会变为 0,否则父进程不关闭的话始终占用引用计数)、子进程需要关闭sockfd
关于父子进程并发,那么父进程和子进程共用同一端口及 IP 地址。当父进程的监听套接字封装完毕后,此连接套接字的套接字对(套接字对是唯一标识一个网络上的每个 TCP 链接)可以表示为
{*:21 , *:*}
,第一个*
(通配符)表示任意本地端口(也就是说如果服务器是多宿的话,那么此主机可能拥有多个服务器 IP 地址,要么指定一个,要么指定任意),第二对*.*
表示外部 IP 地址和外部端口号(也就是链接的客户端的信息)。
当一个客户端连接的时候,产生已连接套接字,此套接字的外部地址及外部端口号立即被填充,也就是说通过父进程的监听套接字和子进程的已连接套接字的套接字对来区分接收到的同一端口和 IP 地址的信息到底发送给谁。比方说
1.1.1.1:100
链接了,那么子进程里面的套接字对就被填充为{0.0.0.0:21 , 1.1.1.1:100}
,假设同一客户端又链接了同一服务器的同一端口,那么客户机为这个新客户的套接字分配一个未使用的临时端口比方说是 101,那么服务器针对这两个链接时有区别的:他俩的套接字对不一样。所以以此区分同一端口的父子进程信息不会混乱。
应注意,TCP 无法仅仅通过查看目的端口号来分离外来的分节到不同的端点,他必须查看套接字对的所有 4 个元素才能确定由哪个端点接收某个到达的分节。来自
1.1.1.1:100
目的为0.0.0.0:21
的分节被递送给第一个子进程,来自1.1.1.1:101
目的为0.0.0.0:21
的分节被递送给第二个子进程。所有目的端口为 21 的其他 TCP 分节都被递送给拥有监听套接字的那个最初服务器。