c语言套接字编程中的listen()队列长度?

Posted

技术标签:

【中文标题】c语言套接字编程中的listen()队列长度?【英文标题】:listen() queue length in socket-programing in c? 【发布时间】: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 参数都应该困扰我们,因为这意味着我们不理解它。 【参考方案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()队列长度?的主要内容,如果未能解决你的问题,请参考以下文章

通过 C 中的套接字快速接收不同长度数据包的连续流?

网络编程网络编程相关知识点总结1

网络编程网络编程相关知识点总结1

翻译TCP backlog在Linux中的工作原理

c_cpp C语言中的套接字编程教程

语言互操作性中的套接字编程