【问题标题】:listen() queue length in socket-programing in c?c语言套接字编程中的listen()队列长度?
【发布时间】:2012-10-05 07:04:01
【问题描述】:

我在 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()(和其他)协议的行为依赖于协议?

【问题讨论】:

  • 我不太明白你的意图......你为什么会因为队列已满而拒绝客户?
  • @KarolyHorvath:我的意思是,如果我给出等待队列长度,它应该被拒绝。我想知道这件事。
  • 我认为任何不符合我们预期的 API 参数都应该困扰我们,因为这意味着我们不理解它。

标签: c linux sockets network-protocols listen


【解决方案1】:

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

 listen(int socket_fd, int backlog)  

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

  1. 一个不完整的连接队列 - SYN 已经到来,但三向握手 (TCP) 没有完全完成。 (SYN_RCV 状态)
  2. 完整的连接队列 - 完成了三向握手。 (已建立状态)

backlog 参数历史上指定两个队列的总和。但是对于 backlog 的含义没有正式的定义。

伯克利派生的实现为积压工作添加了一个软糖因素。所以总队列length = factor * backlog

W. Richard Stevens 的书中给出了非常详细和深入的解释。在 Stevens, Fenner, Rudoff, "Unix Network Programming: The Sockets Network API", Volume 1, Third Edition, Page 108 中还可以找到显示七个操作系统值的表格。

【讨论】:

  • 例如在 Linux 2.4.7 上,backlog 的 3 个分配给 listen() 导致最多 6 个连接排队。
  • 在您的回答中编辑了更多细节。谢谢!
  • CentOS 6.6 2.6.32-504.el6.x86_64 积压队列为积压参数+1
【解决方案2】:

平台有权根据其最小值和默认值向上或向下调整指定的积压。如今,默认值更像是 500 而不是 5,这是它在 1983 年左右开始的地方。你不能依赖它是你指定的,而且没有 API 可以找出它到底是什么,也没有明显的希望它比默认值短的有效应用程序原因。

【讨论】:

  • 有些人试图用它来限制并发连接数。不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
相关资源
最近更新 更多