listen()队列长度在套接字编程在c?

我在Linux中写了两对代码( server.cclient.c )。 一个用于UNIX域AF_UNIX另一个用于INTERNET域AF_INET 。 两者都工作正常!

listen()both servers被称为积压队列长度= 3

 listen(sockfd, 3); 

在UNIX域(AF_UNIX):当一个客户端连接到服务器,如果我尝试连接更多的客户端到服务器。 三个排队,第四个请求被拒绝。 (正如我所希望的 – 3在等待队列中)。

在INTERNET域(AF_INET):三个以上的请求被保存在待处理的队列中。

即使积压队列长度为三,为什么不是第四个客户端的请求被拒绝? 为什么listen() (和其他)协议的行为依赖于?

Solutions Collecting From Web of "listen()队列长度在套接字编程在c?"

对于传入的TCP连接,操作系统实际上使用比指定listen()更大的队列。 多大取决于操作系统。

  listen(int socket_fd, int backlog) 

对于给定的监听套接字,维护两个队列。

  1. 一个不完整的连接队列 – SYN已经到达,但是三次握手(TCP)没有完成。 (SYN_RCV状态)
  2. 完整的连接队列 – 完成三次握手。 (ESTABLISHED状态)

积压参数历史地指定两个队列的总和。 但是积压的含义没有正式的定义。

伯克利派生的实现增加了积压因素。 所以总队列length = factor * backlog

W. Richard Stevens在一本书中给出的非常详细和深刻的解释。 此外,在Stevens,Fenner,Rudoff的“ Unix网络编程:套接字网络API ”第一卷第三版第108页中还可以找到显示七个操作系统值的表格。

该平台有权根据其最小值和缺省值调整指定的积压或升降。 现在的默认值更像是500比5,这是它在1983年左右开始的地方。你不能依赖于你指定的东西,也没有找到真正的API的方法,有效的申请理由,希望它比默认短。