2012-10-15 26 views
8

我在Linux中编写了两对代码(server.cclient.c)。一个用于UNIX域AF_UNIX其他用于INTERNET域AF_INET。两者都正常工作!listen()队列长度在套接字编程中c?

listen()为缓冲区队列长度称为= 3both servers

listen(sockfd, 3); 

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

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

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

+0

我真的不明白你的意图......为什么你会因为排队满了而拒绝客户? –

+1

@ KarolyHorvath:我的意思是,如果我给予排队长度等待,它应该被拒绝。我想知道这一点。 –

+0

@Grijesh Chauhan:理论上......是的...... *实际上* ..谁在乎?为什么这会打扰你? –

回答

9

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

listen(int socket_fd, int backlog) 

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

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

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

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

W. Richard Stevens在书中给出了非常详细和深入的解释。此外,可以在Stevens,Fenner,Rudoff的“Unix Network Programming: The Sockets Network API”,第1卷,第三版,第108页中找到显示七个操作系统的值的表格。

+1

例如在Linux 2.4上。7给'listen()'3的'backlog'导致最多6个连接排队。 –

+1

在你的答案中编辑了一些更多细节。谢谢! –

+0

CentOS 6.6 2.6.32-504.el6.x86_64 积压队列是积压参数+1 – adrianlzt

3

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