news 2026/5/1 9:46:48

为什么accept要放在while循环中?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
为什么accept要放在while循环中?

1、概述

在看服务器相关代码,会看到类似代码,while循环不断调用accept(),为什么呢?
void CBaseSocket::_AcceptNewSocket()
{
SOCKET fd = 0;
sockaddr_in peer_addr;
socklen_t addr_len = sizeof(sockaddr_in);
char ip_str[64];
while ( (fd = accept(m_socket, (sockaddr*)&peer_addr, &addr_len)) != INVALID_SOCKET )
{
// 其他代码
}
}

2、分析

1、并发连接场景
accept函数是从服务端监听套接字的已完成连接队列中取出一个连接,返回一个新的socket来和客户端交互。如果短时间内有多个连接,这些连接会先进入已完成连接队列排队。如果只调用一次accept(),只能取走队列中的一个连接,剩下的连接会一直在队列中,客户端会超时或一直等待。


2、IO多路复用"边缘触发(ET)模式"
在epoll的ET模式下,当有新连接时,epoll只会通知一次,如果只调用一次accept(),而实际上队列里有多个连接,剩下的连接不会再触发epoll事件(ET模式不会重复通知),导致这些连接永远无法被处理。

while 循环的本质,就是在本次事件触发中,一次性处理完内核 “已完成连接队列” 里的所有待处理连接,直到队列为空为止。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 8:27:44

基于STM32的蜂鸣器电路应用:PWM调音实战案例

蜂鸣器还能这样玩?用STM32实现电子琴级音效的实战全解析你有没有遇到过这样的场景:智能门锁验证成功,只听到一声干巴巴的“滴”;工业设备报警时,所有故障都发出同样的长鸣;儿童玩具按下按钮,永远…

作者头像 李华
网站建设 2026/5/1 7:51:38

Windows系统下python新一代三方库管理工具uv及VSCode配置

安装 uv 工具uv 是 Rust 编写的 Python 工具链替代方案,支持快速依赖解析和虚拟环境管理。通过以下命令安装:pip install uv安装后可通过 uv --version 验证是否成功。使用 uv 管理虚拟环境创建并激活虚拟环境:uv venv .venv # 创建虚…

作者头像 李华
网站建设 2026/5/1 5:48:33

Python 机器人大脑构建指南:路径规划与决策算法深度解析

路径规划与决策算法概述路径规划与决策算法是机器人大脑的核心模块,涉及从环境感知到目标驱动的动态决策过程。常见方法包括基于图搜索的全局规划(如A*、Dijkstra)、局部避障算法(如动态窗口法DWA),以及结合…

作者头像 李华
网站建设 2026/5/1 6:49:31

智能环境监测仪:proteus数码管实时数据显示教程

从仿真到实战:如何用Proteus实现智能环境监测仪的数码管实时显示你有没有遇到过这样的情况?想做一个能测温湿度的小设备,但还没买开发板、没焊电路,代码写好了却不知道能不能跑通?调试时发现数码管闪烁、乱码&#xff…

作者头像 李华
网站建设 2026/5/1 6:56:12

⚡_实时系统性能优化:从毫秒到微秒的突破[20260113165144]

作为一名专注于实时系统性能优化的工程师,我在过去的项目中积累了丰富的低延迟优化经验。实时系统对性能的要求极其严格,任何微小的延迟都可能影响系统的正确性和用户体验。今天我要分享的是在实时系统中实现从毫秒到微秒级性能突破的实战经验。 &#…

作者头像 李华