c语言套接字编程中的listen()队列长度?
Posted
技术标签:
【中文标题】c语言套接字编程中的listen()队列长度?【英文标题】:listen() queue length in socket-programing in c? 【发布时间】:2012-10-05 07:04:01 【问题描述】:我在 Linux 中编写了两对代码(server.c
和 client.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 参数都应该困扰我们,因为这意味着我们不理解它。 【参考方案1】:操作系统实际上为传入的 TCP 连接使用了比listen()
指定的更大的队列。多大取决于操作系统。
listen(int socket_fd, int backlog)
对于给定的侦听套接字,内核维护两个队列。
-
一个不完整的连接队列 - SYN 已经到来,但三向握手 (TCP) 没有完全完成。 (SYN_RCV 状态)
完整的连接队列 - 完成了三向握手。 (已建立状态)
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 可以找出它到底是什么,也没有明显的希望它比默认值短的有效应用程序原因。
【讨论】:
有些人试图用它来限制并发连接数。不是。以上是关于c语言套接字编程中的listen()队列长度?的主要内容,如果未能解决你的问题,请参考以下文章