首页 > 解决方案 > Socket编程中listen()的目的是什么?

问题描述

ret = listen(connection_socket, 1); //允许队列中的一个连接

我已经打开了 2 个终端并同时在所有 2 个终端中运行了客户端进程。

这里服务器正忙于处理 client1 的数据,现在 client2 处于待处理队列中。现在队列已满。

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

标签: clinuxsocketstcplisten

解决方案


listen告诉 TCP/IP 堆栈开始接受套接字绑定到的端口上的传入 TCP 连接。

backlog 参数不是“允许的最大连接数”参数。相反,它只是向堆栈提示,在应用程序代码在该套接字上调用之前,该套接字的端口上可以接受多少个 TCP 连接accept。请注意,accept它不会协商 TCP 握手,它只是将已接受的连接之一从积压队列中取出(或等待一个连接到达)。

因此,如果您的 backlog 为 1 并且您的服务器线程没有等待accept,则意味着传入的客户端连接至少会建立 TCP 握手。accept如果您在积压队列为 1 时尝试拥有两个挂起的连接,如果服务器代码没有主动调用以将这些连接从积压队列中提升到套接字中,则第二个客户端连接可能会超时或被拒绝。


推荐阅读