listen()忽略积压参数?

我有以下问题:

我有sockfd = socket(AF_INET, SOCK_STREAM, 0)

当我build立并绑定套接字(比如sockfd.sin_port = htons(666) )后,我立刻做了:

 listen(sockfd, 3); sleep(50); // for test purposes 

我睡了50秒来testing积压参数,这似乎被忽略,因为我可以build立连接*在端口666上超过3次。

*:我的意思是,我从每个从客户端发送的第N个SYN(n> 3)获得一个syn / ack,并放入监听队列中,而不是被丢弃。 什么可能是错的? 我读过listen(2)和tcp(7)的man页面,发现:

Linux套接字上的backlog参数的行为随Linux 2.2而改变。 现在它指定了等待被接受的完全build立的套接字的队列长度,而不是不完整的连接请求的数目。 不完整套接字队列的最大长度可以使用/ proc / sys / net / ipv4 / tcp_max_syn_backlog来设置。 当启用syncookies时,没有逻辑最大长度,这个设置被忽略。 有关更多信息,请参阅tcp(7)。

,但即使使用sysctl -w sys.net.ipv4.tcp_max_syn_backlog=2sysctl -w net.ipv4.tcp_syncookies=0 ,我仍然得到相同的结果! 我一定是错过了一些东西,或者完全误解了listen()的积压目的。

listen()的backlog参数只是build议性的。

POSIX说 :

backlog参数为执行提供了一个提示 ,实现将使用该提示来限制套接字侦听队列中未完成连接的数量。

当前版本的Linux内核将其整合到了下一个最高功耗的两个,最低为16.相关代码位于reqsk_queue_alloc()中 。

不同的操作系统提供不同的积压号码的不同数量的排队连接。 FreeBSD似乎是实际上具有1对1映射的less数几个操作系统之一。 (来源: http : //books.google.com/books?id=ptSC4LpwGA0C&lpg=PA108&ots=Kq9FQogkTr&dq=berkeley%20listen%20backlog%20ack&pg=PA108#v=onepage&q=berkeley%20listen%20backlog%20ack&f=false )

Interesting Posts