我遇到了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()接收僅單條消息被讀取
是的。這確實是問題。現在我已經把等級作爲等級觸發了。它工作正常。謝謝。 – user2639661