天天看点

Unix Network Programming(12)---listen 函数

listen 函数仅由TCP服务器调用,它做两件事情。
  1. 当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字。listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应接收指向该套接字的连接请求。根据TCP状态转换图,服务器将由CLOSED状态转换到LISTEN状态。
  2. 本函数第二个参数规定了内核应该为相应的套接字排队的最大连接个数。
#include <sys/socket.h>
int listen(int sockfd, int backlog);/*返回:若成功则为0,出错则为-1*/
           

backlog参数

内核为任何一个给定的监听套接字 维护两个队列:

  1. 未完成连接队列,每个这样的SYN分节对应其中一项:已由某个客户发出并到达服务器,而服务器正在等待完成相应的TCP三路握手过程。这些套接字处于SYN_RCVD状态。
  2. 已完成连接队列(queue),每个已完成TCP三路握手过程的客户对应其中一项。这些套接字处于ESTABLISHED状态。

三路握手中的两个队列:当来自客户SYN到达时,TCP在未完成连接队列中创建一个新项,然后相应以三路握手的第二个分节:服务器的SYN响应,其中捎带对客户SYN的ACK。这一项一直保留在未完成队列中,直到三路握手的第三个分节(客户对于服务器SYN的ACK)到达或者该项超时为止。如果三路握手正常完成,该项就从未完成队列移到已完成队列的队尾。当调用accept时,已完成连接队列的队头项将返回给进程,或者如果该队列为空,那么进程将被投入睡眠,直到TCP在该队列中放入一项才唤醒它。

书!P85