Socket编程中的listen()函数有什么用?

4

ret = listen(connection_socket, 1); // 允许一个连接在队列中等待。

我已经打开了两个终端并同时运行了客户端进程。

服务器正在处理客户端1的数据,现在客户端2在等待队列中。此时队列已满。

在这个阶段,我启动了第三个终端并运行了客户端进程。由于队列已满,这个客户端的连接应该返回-1,并且errno应该设置为ECONNREFUSED,但是在这种情况下,connect对于客户端3也返回0。那么listen()系统调用的目的是什么呢?


2
看起来listen文档中的“or”子句可能会提供您正在寻找的提示。 - WhozCraig
1个回答

9
listen指示TCP/IP栈开始在套接字绑定的端口上接受传入的TCP连接。
backlog 参数不是“允许的最大连接数”参数。相反,它只是向栈提示关于套接字端口上可以接受多少个TCP连接的信息,直到应用程序代码已经在套接字上调用了accept。请注意,accept不会协商TCP握手,它只从后台队列中取出一个已经被接受的连接(或等待一个连接的到来)。
因此,如果您的backlog值为1,并且您的服务器线程没有在等待accept,这意味着传入的客户端连接至少会建立TCP握手。如果您尝试在backlog队列为1时拥有两个挂起的连接,则第二个客户端连接可能会超时或被拒绝,如果服务器代码不积极地调用accept将这些连接推出backlog队列并放入套接字中。

由于OP的服务器尚未接受连接,但客户端的连接已成功。那么对该套接字的即时写入会发生什么情况呢? - undefined
这将与一个未调用“read”或“recv”的服务器相同。最终,滑动窗口将收缩到零,直到服务器将数据出队为止,不会发生进一步的传输。 - undefined
这似乎是一个很大的缺点,因为在服务器上,如果 OP 启动更多这样的客户端,会分配缓冲区,可能会导致服务器内存严重不足。 - undefined
@RootPhoenix - 这就是listen函数的第二个参数的整个意义所在。请参考上面的答案。 - undefined

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