2013-07-31 89 views
0

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

代码片段给出 -

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 
} 

的问题是固定的(即套接字缓冲区不fillup)如果recvmsg被称为while循环,直到EAGAIN之前去为下一个描述符中。

任何想法,为什么套接字缓冲区得到填补的时候,每个事件从epoll_wait()接收仅单条消息被读取

回答

1

已经很晚了我在哪里,但我会努力让自己了解:)

我会参考Epoll的手册页,例如可以在linux.die.net上找到。 epoll与EPOLLET一起使用时会触发边缘(EPOLLET中的ET)。这意味着它会触发状态的变化。如果您收到多条消息,但仅在读取第一条消息之前以无限超时的方式调用epoll_wait(),则基本上已经按照手册页描述的方式自行关闭。总结:由于epoll_wait正在等待更改(从none到某些消息),但已经有消息可用,所以状态转换以及事件将永远不会发生。

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

+0

是的。这确实是问题。现在我已经把等级作为等级触发了。它工作正常。谢谢。 – user2639661

相关问题