2013-07-31 116 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

相關問題