listen()在c中的socket编程中的队列长度?

时间:2012-10-15 10:05:58

标签: c linux sockets network-protocols listen

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

listen()both servers

中被称为,用于积压队列长度= 3
listen(sockfd, 3);  

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

在INTERNET域(AF_INET)中:超过三个请求保留在待处理队列中。

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

2 个答案:

答案 0 :(得分:9)

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

 listen(int socket_fd, int backlog)  

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

  1. 一个不完整的连接队列 - 已经发生了SYN,但没有完全完成三方握手(TCP)。 (SYN_RCV州)
  2. 完整的连接队列 - 完成三方握手。 (ESTABLISHED state)
  3. 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来找出它到底是什么,并且没有明显的希望它比默认值短的有效申请理由。