news 2026/4/23 13:58:47

为什么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/23 12:16:00

STM32主频提升秘诀:PLL高速时钟深度剖析

STM32主频提升实战指南:从PLL原理到CubeMX时钟树精调你有没有遇到过这样的情况?写好了复杂的FFT算法,信心满满地下载进STM32F407,结果发现数据处理延迟严重——一查才发现,CPU主频还停留在默认的16MHz HSI上&#xff0…

作者头像 李华
网站建设 2026/4/23 12:25:20

全场景防护下的国内文档安全厂商:技术演进与竞争格局解析

在数字化转型纵深推进与数据安全法规体系持续完善的双重驱动下,文档作为企业核心数据的主要载体,其安全防护已从单一加密需求,升级为覆盖“创建-流转-存储-销毁”全生命周期、适配多终端多环境的全场景管控需求。2025年,国内文档安…

作者头像 李华
网站建设 2026/4/23 12:22:24

STM32CubeMX时钟树错误排查:F4系列常见问题指南

STM32F4时钟树配置避坑指南:从CubeMX到稳定运行的实战解析在嵌入式开发中,一个看似简单的“板子不启动”问题,背后往往藏着最基础也最关键的环节——时钟系统配置错误。尤其是使用STM32F4系列这类高性能MCU时,虽然主频可达168MHz甚…

作者头像 李华
网站建设 2026/4/23 10:48:36

给定一个二叉树,求其最近公共祖先

二叉树最近公共祖先(LCA)问题全解析:从理论到实践的完美指南 关键词 二叉树, 最近公共祖先, LCA算法, 树遍历, 递归, 数据结构, 算法优化 摘要 最近公共祖先(Lowest Common Ancestor, LCA)问题是二叉树操作中的经典问题,在计算机科学领域有着广泛的应用。本文将带领读者深…

作者头像 李华
网站建设 2026/4/22 21:06:18

C语言中的逻辑与运算误区

在C语言编程中,逻辑运算符的理解和使用是每个程序员必须掌握的基本技能。然而,在实际编程中,很多初学者(甚至是一些经验丰富的程序员)可能会因为一些细微的误解而陷入困惑。今天,我们通过一个具体的例子来深入探讨C语言中的逻辑与运算(&&)。 问题背景 假设有一…

作者头像 李华
网站建设 2026/4/23 13:19:07

什么是PIM

文章目录为什么需要PIMPIM应用场景有哪些PIM协议是如何工作的PIM(Protocol Independent Multicast)称为协议无关组播。这里的协议无关指的是与单播路由协议无关,即PIM不需要维护专门的单播路由信息。作为组播路由解决方案,它直接利…

作者头像 李华