听在C在插座编程()队列长度?(listen() queue length in socket-pr

2019-08-01 11:42发布

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

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

listen(sockfd, 3);  

在UNIX域(AF_UNIX):当一个客户端与服务器连接,如果我尝试更多的客户端连接到服务器。 三是保留在队列中,第四请求被拒绝。 ( - 在等待队列3如我所需的)。

在因特网域(AF_INET):三个以上的请求被保持在一个等待队列。

为什么不从第四客户端的请求被拒绝,即使在backlog队列长度为3? 为什么是行为listen()及其他)协议相关?

Answer 1:

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

 listen(int socket_fd, int backlog)  

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

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

积压的说法在历史上同时指定队列的总和。 但有什么积压意味着没有正式定义。

伯克利的实现添加蒙混因素积压。 所以总队列length = factor * backlog

在一本由理查德·史蒂文斯给出了非常详细和深入的解释。 也显示出七个操作系统值的表可在史蒂文斯,芬纳,Rudoff发现,“ unix网络编程:套接字网络API ”,第1卷,第三版,页108。



Answer 2:

该平台有权向上或向下调整指定的积压,根据其最低和默认值。 这些天默认更像是500超过五个,这是它在1983年左右开始你不能依赖它是你指定的内容,并没有用于找出它到底是什么没有API,并没有明显的有效的应用之所以想它是不是默认短。



文章来源: listen() queue length in socket-programing in c?