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

Gri*_*han 9 c sockets linux network-protocols listen

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

listen()调用积压队列长度= 3 inboth servers

listen(sockfd, 3);  
Run Code Online (Sandbox Code Playgroud)

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

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

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

Seg*_*ult 10

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

 listen(int socket_fd, int backlog)  
Run Code Online (Sandbox Code Playgroud)

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

  1. 一个不完整的连接队列 - 已经发生了SYN但是三方握手(TCP)并没有完全完成.(SYN_RCV状态)
  2. 完整的连接队列 - 完成三方握手.(已建立的州)

backlog参数历史上指定两个队列的总和.但积压的含义并没有正式的定义.

Berkeley派生的实现为积压添加了一个软糖因素.所以总队列length = factor * backlog.

W. Richard Stevens在一本书中给出的非常详细和深刻的解释.此外,还可以在Stevens,Fenner,Rudoff," Unix网络编程:套接字网络API ",第1卷,第3版,第108页中找到显示7个​​操作系统的值的表.