c - Socket编程中listen()的目的是什么?
问题描述
ret = listen(connection_socket, 1);
//允许队列中的一个连接
我已经打开了 2 个终端并同时在所有 2 个终端中运行了客户端进程。
这里服务器正忙于处理 client1 的数据,现在 client2 处于待处理队列中。现在队列已满。
在这个阶段,我已经启动了第三个终端并运行了客户端进程。正弦队列已满,此客户端的连接应返回 -1 并且 errno 应设置为 ECONNREFUSED,但在这种情况下,客户端 3 的连接也返回 0。那么listen()
系统调用的目的是什么。
解决方案
listen
告诉 TCP/IP 堆栈开始接受套接字绑定到的端口上的传入 TCP 连接。
backlog 参数不是“允许的最大连接数”参数。相反,它只是向堆栈提示,在应用程序代码在该套接字上调用之前,该套接字的端口上可以接受多少个 TCP 连接accept
。请注意,accept
它不会协商 TCP 握手,它只是将已接受的连接之一从积压队列中取出(或等待一个连接到达)。
因此,如果您的 backlog 为 1 并且您的服务器线程没有等待accept
,则意味着传入的客户端连接至少会建立 TCP 握手。accept
如果您在积压队列为 1 时尝试拥有两个挂起的连接,如果服务器代码没有主动调用以将这些连接从积压队列中提升到套接字中,则第二个客户端连接可能会超时或被拒绝。
推荐阅读
- c# - Asp.net Core:中间件到控制器的转换问题?
- java - 使用来自两个存储库的信息创建 Excel 电子表格
- jquery - 如何在 Datatable 的一列中显示 json 数组?
- java - 如何在 4 秒内定期生成不同的随机数?
- css - 文本框内的图标 - 几乎像 glyphicon 图标
- codeigniter - 在 Codeigniter 应用程序中收到“403 您无权访问 / 在此服务器上”
- javascript - 刷新应用程序后如何更新状态 - React Native?
- python - 抓取表没有提供任何结果
- excel - EXCEL 2016 VBA:WorksheetFunction.Power() 不返回数字
- excel - 根据日期范围多次将行复制到另一个工作表