为什么我不';当我连接的套接字多于要侦听的参数backlog时,是否不会出错?
我有一个被动插座,可以监听如下连接:为什么我不';当我连接的套接字多于要侦听的参数backlog时,是否不会出错?,c,sockets,listen,econnrefused,C,Sockets,Listen,Econnrefused,我有一个被动插座,可以监听如下连接: t = listen(fd, 1); fd是以前创建的套接字的文件描述符。 如您所见,如果我理解得很好,listen()应该只能在其挂起连接队列中放置一个传入套接字(因为其backlog参数=1)。但是,如果我尝试将几个插座连接到被动插座,我不会得到任何错误。我希望有一个econnrefered错误,因为队列已满 为什么我失踪了?根据男人听(2),强调我的: backlog参数定义队列的最大长度 sockfd的挂起连接可能会增加。如果有连接请求 当队列已
t = listen(fd, 1);
fd
是以前创建的套接字的文件描述符。如您所见,如果我理解得很好,listen()应该只能在其挂起连接队列中放置一个传入套接字(因为其backlog参数=1)。但是,如果我尝试将几个插座连接到被动插座,我不会得到任何错误。我希望有一个
econnrefered
错误,因为队列已满
为什么我失踪了?根据男人听(2)
,强调我的:
backlog参数定义队列的最大长度
sockfd的挂起连接可能会增加。如果有连接请求
当队列已满时到达,客户端可能会收到错误消息
指示ECONREFUSE或,如果基础协议支持
重新传输时,请求可能会被忽略,以便稍后重新尝试
at连接成功
如果您使用的是TCP套接字,则会出现这种行为,因为TCP支持重新传输。您是否捕获了数据包并验证是否从服务器接收到SYN-ACK?backlog参数只是一个提示。Linux上的有效最小值似乎是16。@jxh不,我没有验证它,如果是这样的话,我能得出什么结论?@KarstenKoop我不明白一个论点的要点,即它最终被另一个值替换,但可以。有没有办法设定一个最大值?或者有没有一种方法可以通过编程方式找到它?如果返回SYN-ACK,则可能意味着服务器已允许连接请求进入其侦听队列。如果没有,则可能是服务器已放弃连接请求。因此使用TCP没有限制?我怎样才能设置一个呢?从服务器的角度来看,这是一个限制,它正是您提供给
listen()
的数字。所有其他连接尝试都将被忽略。从客户端的角度来看,一个connect()
似乎只需要花费很多时间。我认为实现超时是一个很好的解决方案,这样客户端代码就不会无限期(或长时间)阻塞。