讓我們考慮下面的代碼段行爲投票()系統調用和接收或發送數據之後
pollfd file_descriptors[1];
file_descriptors[0].fd = sock_fd;
file_descriptors[0].events = POLLIN;
int return_value = poll(file_descriptors, 1, 0);
if (return_value == -1) { cerr << strerror(errno); }
else if (return_value == 0) { cerr << "No data available to be read"; }
else {
if (file_descriptors[0].revents & POLLIN) {
recv(sock_fd, buff, 1024, 0);
}
}
現在我有一個關於上面的代碼中的兩個問題。
- 如果調用輪詢()返回既不
-1
也不0
並設置POLLIN
標誌位圖中的revents
爲file_descriptors
陣列中的第一個條目,然後將調用recv()
塊?如果不是,那麼數據會被即時讀取? - 假設對
poll()
的呼叫採用與上述相同的方式。將讀入多少數據?它是否會像定期致電recv()
一樣?即在上述情況下小於或等於1024
的任意(對程序員)的數量。然後,如果我想在再次閱讀之前想要poll()
,那麼我是否只需從第一次調用poll()
開始重複,直到完全讀取所有數據(即在客戶端服務器場景中,這將對應於請求正在完成爲止)?
謝謝!
3,請參閱http://stackoverflow.com/questions/589928/socket-programming-how-do-i-handle-out-of-band-data。實際上,如果一個套接字端發送正常數據和*然後* OOB數據,則客戶端儘可能快地獲得OOB數據,可能*在其他數據之前。 [好吧,這取決於客戶如何調用recv,以及其他一些事情,這不是全部內容......查看鏈接] – deviantfan
非常感謝!我會研究一下:) – Curious
@deviantfan從我在這個問題的答案中讀到的。我將忽略當前用例中的所有OOB數據。但我有一個後續問題。如果確實發送了一些OOB數據,並且我忽略它,也就是隻調用recv()。數據會被忽略嗎?或者將它注入到我正在閱讀的字節流(或recv() - ing)中? – Curious