我在Linux中编写了两对代码(server.c
和client.c
)。一个用于UNIX域AF_UNIX
,另一个用于INTERNET域AF_INET
。两者都工作正常!
listen()
在both servers
listen(sockfd, 3);
在UNIX域(AF_UNIX)中:当一个客户端与服务器连接时,如果我尝试将更多客户端连接到服务器。三个被排队,第四个的请求被拒绝了。 (正如我所希望的 - 等待队列中的3个)。
在INTERNET域(AF_INET)中:超过三个请求保留在待处理队列中。
为什么即使积压队列长度为3,第四个客户端的请求也不会被拒绝?为什么listen()
(和其他)协议的行为依赖于?
答案 0 :(得分:9)
操作系统实际上使用比指定给listen()
的TCP连接更大的队列。多大程度取决于操作系统。
listen(int socket_fd, int backlog)
对于给定的侦听套接字,kernal维护两个队列。
backlog 参数历史上指定两个队列的总和。但 backlog 的含义并没有正式的定义。
Berkeley派生的实现为积压添加了一个软糖因素。所以总队列length = factor * backlog
。
W. Richard Stevens在一本书中给出的非常详细和深刻的解释。此外,还可以在Stevens,Fenner,Rudoff,“Unix Network Programming: The Sockets Network API”,第1卷,第3版,第108页中找到显示七种操作系统值的表格。
答案 1 :(得分:3)
平台有权根据其最小值和默认值向上或向下调整指定的积压。这些天的默认值更像是500比五,这是它在大约1983年开始的地方。你不能依赖它是你指定的,并且没有API来找出它到底是什么,并且没有明显的希望它比默认值短的有效申请理由。