Abh*_*gar 2 c sockets linux tcp listen
ret = listen(connection_socket, 1);  //允许队列中有一个连接
我打开了 2 个终端并同时在所有 2 个终端中运行客户端进程。
这里服务器正忙于处理客户端 1 的数据,现在客户端 2 处于待处理队列中。现在队列已满。
在这个阶段,我已经启动了第三个终端并运行了客户端进程。正弦队列已满,此客户端的 connect 应返回 -1 并且 errno 应设置为 ECONNREFUSED,但在这种情况下,connect 也为客户端 3 返回 0。那么listen()系统调用的目的是什么。
listen 告诉 TCP/IP 堆栈开始接受套接字绑定到的端口上的传入 TCP 连接。
backlog 参数不是“允许的最大连接数”参数。相反,它只是向堆栈提示在应用程序代码accept在该套接字上调用之前在该套接字的端口上可以接受多少个 TCP 连接。请注意,accept它不会协商 TCP 握手,它只是从积压队列中取出一个已接受的连接(或等待一个连接到达)。
因此,如果您的积压为 1 并且您的服务器线程没有等待accept,则意味着传入的客户端连接至少将建立 TCP 握手。如果您在积压队列为 1 时尝试有两个挂起的连接,如果服务器代码没有主动调用accept将这些连接从积压队列中提升到套接字中,则第二个客户端连接可能会超时或被拒绝。