listen()忽略了积压参数?

时间:2011-02-24 22:01:38

标签: c linux sockets listen

我有以下问题:

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

在我设置并绑定套接字后(假设使用sockfd.sin_port = htons(666)),我立即执行:

listen(sockfd, 3);

sleep(50); // for test purposes

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

*:我的意思是我从客户端发送的每个第N个SYN(n> 3)得到一个syn / ack并放在侦听队列中,而不是被丢弃。可能有什么不对?我已经阅读了listen(2)和tcp(7)的手册页,并发现:

  

使用Linux 2.2改变了TCP套接字上的backlog参数的行为。   现在它指定了等待接受的完全建立的套接字的队列长度,而不是未完成的连接请求的数量。不完整套接字的队列的最大长度可以   使用          的/ proc / SYS /网/的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()的积压目的。

2 个答案:

答案 0 :(得分:38)

listen()的积压参数只是建议性的。

POSIX says

  

backlog参数提供提示   执行哪个   实施应用于限制   中的未完成连接数   套接字的侦听队列。

当前版本的Linux内核将其最接近2的最高幂,最小值为16.令人尊敬的代码位于reqsk_queue_alloc()

答案 1 :(得分:3)

不同的操作系统提供不同数量的排队连接和不同的积压数。 FreeBSD似乎是少数实际上具有1对1映射的操作系统之一。 (来源: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