news 2026/5/23 13:38:57

为什么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/5/14 8:02:31

企业考勤财务智能报表系统_SpringBoot+Vue+Springcloud微服务分布式

以下是关于企业考勤财务智能报表系统采用SpringBootVueSpringCloud微服务分布式架构的技术实现方案:技术架构设计后端采用SpringCloud Alibaba微服务套件(Nacos注册中心、Sentinel流量控制、Seata分布式事务),前端使用Vue3Element…

作者头像 李华
网站建设 2026/5/22 14:25:42

Spring Boot 自动配置原理与自定义 Starter 开发实战

Spring Boot 自动配置原理Spring Boot 自动配置的核心是通过条件化配置(Conditional)实现。当满足特定条件时,相关的 Bean 会被自动加载到 Spring 容器中。自动配置的触发依赖于 spring-boot-autoconfigure 模块中的 META-INF/spring/org.spr…

作者头像 李华
网站建设 2026/5/19 7:11:35

上线前检查清单模板及工具指南:告别手忙脚乱,实现稳定发布

周五下午6点,所有人都盯着屏幕:“数据库脚本执行了吗?”“配置文件更新了没有?”“监控告警设置了么?”——这些问题像复读机一样在会议室回响。而最可怕的是,上线后发现:“完了,有个…

作者头像 李华
网站建设 2026/5/13 18:11:08

web智慧社区设计与实现信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着城市化进程的加速和信息技术的飞速发展,智慧社区成为提升居民生活质量、优化社区管理效率的重要方向。传统社区管理模式存在信息孤岛、管理效率低下、服务响应滞后等问题,难以满足现代居民对便捷化、智能化生活的需求。智慧社区信息管理系统通过…

作者头像 李华
网站建设 2026/5/3 17:33:52

什么是PROFINET

文章目录为什么需要PROFINETPROFINET IO系统有哪些组成PROFINET是如何工作的PROFINET采用TCP/IP协议作为基础,并在其应用层上增加了实时机制和通讯协议,因此具有和标准以太网相同的一些特性如全双工、多种拓扑结构等,其速率可达千兆。另外它也…

作者头像 李华