【问题标题】:What is the purpose of listen() in Socket Programming? [duplicate]Socket编程中listen()的目的是什么? [复制]
【发布时间】:2020-05-27 14:04:23
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c linux sockets tcp listen


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-20
    • 2015-08-21
    • 2013-11-27
    • 2014-01-31
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多