为什么我连接的套接字数量超过了listen函数指定的backlog参数,却没有收到错误提示?

3

我有一个被动套接字,像这样监听连接:

t = listen(fd, 1); 

fd 是先前创建的套接字的文件描述符。
如您所见并且如果我理解正确,listen()应该能够将仅一个传入套接字放置在其挂起连接队列中(因为其backlog参数= 1)。但是,如果我尝试将多个套接字连接到被动套接字,我不会收到任何错误。我期望会出现ECONNREFUSED错误,因为队列已满。

我错在哪里了?


你是否进行了数据包捕获并验证是否从服务器接收到SYN-ACK? - jxh
backlog参数只是一个提示,请参考此答案。在Linux上的有效最小值似乎是16。 - Karsten Koop
@jxh,我没有验证过,如果是这种情况,我能得出什么结论呢? - Simon
@KarstenKoop 我不明白为什么要争论一个最终会被其他值替换的参数,但好吧。无论如何,有没有一种方法可以设置一个最大值?或者有没有一种编程方式可以找到它? - Simon
如果返回SYN-ACK,则很可能意味着服务器已允许连接请求进入其侦听队列。如果没有,则很可能是服务器已放弃连接请求。 - jxh
1个回答

3
根据man listen(2)(重点标注是我的):
待处理连接队列的 backlog 参数定义了 sockfd 可以增长到的最大长度。如果连接请求在队列已满时到达,客户端可能会收到一个带有 ECONNREFUSED 指示的错误,或者,如果底层协议支持重传,则该请求可能会被忽略,以便稍后重新尝试连接成功。
如果您正在使用 TCP 套接字,则此行为是预期的,因为 TCP 支持重传。

那么使用TCP没有限制吗?我该如何设置限制呢? - Simon
1
从服务器的角度来看,有一个限制,它正好是您提供给 listen() 的数字。所有其他连接尝试都将被忽略。 从客户端的角度来看,似乎 connect() 只是需要很长时间。 我认为实现超时是一个不错的解决方案,这样客户端代码就不会无限期地(或长时间)阻塞。 - leovp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接