函数原型:#int listen (int sockfd, int backlog);
该函数在bind()之后accept()调用之前调用。第一个参数为已经创建的监听socket, 第二个参数是socket 监听队列最大监听连接数。
对于一个给定的监听socket,内核其实维护了两个队列:未完全连接队列和完全连接队列。
未完全连接队列主要存放的是客户端发过来的SYN 报文实体, 此时sockets 处于SYN_RCVD状态。
完全连接队列存放的是经过三此握手建立连接的实体,此时队列中的sockets处于ESTABLISHED状态, accep()调用从该队列中获得socket实体。
未完全连接队列中的实体和完全连接队列的转换过程:
当客户端SYN报文到达时,TCP在未完全连接队列中建立一个相应的实体,并发确认报文(即服务器SYN报文),该实体一直呆在未完全连接队列等待三次握手的第三个报文或者时间超时,当第三个报文到达后该实体从未完全连接队列移动到完全连接队列,等待accep()函数调用。转换图如下: