函数原型:
int listen(int sockfd,int backlog);
作用:
1. 将套接字从CLOSE状态转换到LISTEN状态
2.设置此套接字上排队的最大连接个数
backlog其实是一个连接队列,以下是backlog队列大小公式。
backlog队列总和 = 未完成三次握手队列 + 已经完成三次握手队列
注:
并不是指backlog的上限就是那么大。
listen()对应的内核实现为sys_listen()。
为了理解backlog参数,我们必须认识到内核为任何一个给定的监听套接口维护两个队列:
1、未完成连接队列(incomplete connection queue):服务器处于listen状态时收到客户端syn 报
文(connect)时放入未完成队列中
2、已完成连接队列(completed connection queue):三路握手的第二个状态即服务器syn+ ack响
应client后,此时第三个状态ack报文到达前(客户端对服务器syn的ack)一直保留在未完成连接队列中,
如果三路握手完成,该条目将从未完成连接队列搬到已完成连接队列尾部.
修改连接数:
backlog参数设置既可以在linux内核参数设置(修改文件/etc/sysctl相关参数),也可以在
socket系统调用listen函数时设置(第二个参数),这二者区别是,前者为全局性的,影响所有socket,
后者为局部性的,影响当前socket。