2013-02-03 64 views
0

我已經能夠在您的幫助和閱讀另一個資源後成功地使用epoll,我現在面臨的問題是我需要發送到不同的FD比EPOLLOUT事件返回,所以如果我有5個FD,然後我需要發送到1然後到4,然後回到1,然後到5,依此類推。EPOLLIN併發送沒有EPOLLOUT

下面的僞代碼是什麼我現在有兩個IN和OUT的事件,

while(1) { 

rval = epoll_wait(); 

    for (i = 0; i < rval; i++) { 
    if (events & EPOLLOUT) { 
     //send to the ready FD for sending 
     } 
    if (events & EPOLLIN) { 
     //Receive from ready fd, this part is perfect for my application 
     } 
    } 
} 

我需要做的就是像下面

char buff[100]; 
fd = read_data(buff); // read data ready to send, the return value is the FD the application should send the returned data to 

send(fd, buff, 100, 0); 

,然後我需要EPOLLIN從任何FD接收數據,因爲我會一直接收來自所有的FD,我不知道該怎麼做,請你幫忙?

回答

0

你應該在可以發送的每個FD周圍添加一層包裝:讓它有一些狀態表示「就緒」,並且有一個本地數據隊列。現在創建一個接受數據的接口。如果狀態不「準備好」,立即排隊數據並返回。否則,嘗試發送數據(在循環中),如果您擊中EAGAIN或EWOULDBLOCK,則排隊其餘部分並將「ready」設置爲false。同時,在你的主事件循環中,每當你得到一個EPOLLOUT時,進入一個send循環來排空隊列,並且如果你完成沒有錯誤,將「ready」設置爲true。 (有了這個邏輯,EPOLLOUT應該只在FD沒有「就緒」時纔會觸發,假設你處於邊緣觸發模式。)

+0

我一直在閱讀你的文章一段時間,但我不知道如何要做到這一點 :)。 – user1832809