Gri*_*han 9 c sockets linux network-protocols listen
我在Linux中编写了两对代码(server.c和client.c).一个用于UNIX域,AF_UNIX其他用于INTERNET域AF_INET.两者都工作正常!
listen()调用积压队列长度= 3 inboth servers
listen(sockfd, 3);
Run Code Online (Sandbox Code Playgroud)
在UNIX域(AF_UNIX)中: 当一个客户端与服务器连接时,如果我尝试将更多客户端连接到服务器.三个被排队,第四个的请求被拒绝了.(正如我所希望的 - 等待队列中的3个).
在INTERNET域(AF_INET)中: 超过三个的请求保留在待处理队列中.
即使积压队列长度为3,为什么拒绝来自第四个客户端的请求?为什么listen()(和其他)协议的行为依赖?
Seg*_*ult 10
操作系统实际上使用比指定的TCP连接更大的队列listen().多大程度取决于操作系统.
listen(int socket_fd, int backlog)
Run Code Online (Sandbox Code Playgroud)
对于给定的侦听套接字,kernal维护两个队列.
backlog参数历史上指定两个队列的总和.但积压的含义并没有正式的定义.
Berkeley派生的实现为积压添加了一个软糖因素.所以总队列length = factor * backlog.
W. Richard Stevens在一本书中给出的非常详细和深刻的解释.此外,还可以在Stevens,Fenner,Rudoff," Unix网络编程:套接字网络API ",第1卷,第3版,第108页中找到显示7个操作系统的值的表.