gpt4 book ai didi

c - 调用recvmsg后调用epoll_wait()后udp套接字缓冲区变满

转载 作者:行者123 更新时间:2023-11-30 15:46:50 26 4
gpt4 key购买 nike

我遇到了 UDP 服务器套接字缓冲区已满的问题。一旦缓冲区已满,数据包就会被丢弃。套接字缓冲区大小通过“netstat -anp | grep udp”进行监控。 UDP服务器调用epoll_wait(),然后调用recv_msg()。这是一个非阻塞套接字。

代码片段如下 -

struct epoll_event ev = {(unsigned int)0};
ev.events = (unsigned int) (EPOLLIN | EPOLLET);
ev.data.fd = iSockFd;
int m_sdEpoll = epoll_create(1);

if(epoll_ctl(m_sdEpoll, EPOLL_CTL_ADD, iSockFd, &ev)<0)
{
cout << "Epoll insertion error for sd : " << iSockFd << endl;;
}

while( 1 )
{
struct epoll_event events[1];
int noEvt = epoll_wait(m_sdEpoll, events, 1 , -1);
if(noEvt<0)
{
cout << "epoll_wait error no : "<< endl;
continue;
}
for(int i=0; i<noEvt; i++)
{
int sd = events[i].data.fd;

int recv_bytes = recvmsg(sd, &msg, 0);

} // end of for loop
}

如果在 while 循环中调用 recvmsg 直到在寻找下一个描述符之前找到 EAGAIN,则问题已解决(即套接字缓冲区未填满)。

知道为什么当从 epoll_wait() 接收到的每个事件仅读取单个消息时套接字缓冲区会被填满

最佳答案

现在已经很晚了,但我会尽力让别人理解我的意思:)

我将引用 Epoll 的手册页,可以在 linux.die.net 上找到它。例如。epoll 与 EPOLLET 一起使用时是边沿触发的(EPOLLET 中的 ET)。这意味着它将在状态发生变化时触发。如果您收到多条消息,但在无限超时调用 epoll_wait() 之前只读取了第一条消息,那么您基本上已经陷入了死锁,正如手册页所描述的那样。

总结一下:由于 epoll_wait 正在等待更改(从无消息到某些消息),但已经有可用消息,因此状态转换和事件将永远不会发生。

编辑:偶然发现this回答类似问题。

关于c - 调用recvmsg后调用epoll_wait()后udp套接字缓冲区变满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17980769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com