Mar*_*ney 26 c sockets linux listen
我有以下问题:
我有 sockfd = socket(AF_INET, SOCK_STREAM, 0)
在我设置并绑定套接字后(让我们说sockfd.sin_port = htons(666)),我立即执行:
listen(sockfd, 3);
sleep(50); // for test purposes
Run Code Online (Sandbox Code Playgroud)
我正在睡觉50秒来测试积压参数,这似乎被忽略了,因为我可以在端口666上建立连接*超过3次.
*:我的意思是我从客户端发送的每个第N个SYN(n> 3)获得一个syn/ack并放置在侦听队列中,而不是被丢弃.可能有什么不对?我已经阅读了listen(2)和tcp(7)的手册页,发现:
使用Linux 2.2更改了TCP套接字上的backlog参数的行为.现在它指定了等待接受的完全建立的套接字的队列长度,而不是未完成的连接请求的数量.可以使用/ proc/sys/net/ipv4/tcp_max_syn_backlog设置不完整套接字的队列的最大长度.启用syncookies时,没有逻辑最大长度,并忽略此设置.有关更多信息,请参阅tcp(7).
,但即使有sysctl -w sys.net.ipv4.tcp_max_syn_backlog=2和sysctl -w net.ipv4.tcp_syncookies=0,我仍然得到相同的结果!我必须遗漏一些东西或完全误解了listen()积压的目的.
caf*_*caf 39
积压参数listen()只是建议性的.
backlog参数提供了 实现的提示,实现将使用该提示来限制套接字侦听队列中未完成连接的数量.
当前版本的Linux内核将其四舍五入到下一个最高权力为2,最小值为16.重要代码在reqsk_queue_alloc()中.
不同的操作系统提供不同数量的排队连接和不同的积压数量。FreeBSD 似乎是少数实际上具有一对一映射的操作系统之一。(来源: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)