信阳市网站建设_网站建设公司_服务器维护_seo优化
2026/1/14 1:14:15 网站建设 项目流程

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询