2011-06-21 19 views
1

我正在使用epoll進行網絡編程。我想知道服務器沒有收到所有發送的數據客戶端的情況。例如,如果一個客戶端發送了100個字節,並且某個服務器只收到了94個字節。我如何處理這種情況?epoll異常處理

在此先感謝..

+0

這與C++或epoll沒有任何關係。 –

+0

通常,這必須在應用程序級別進行處理,如果您收到的數據比預期的少,則需要以某種方式重新請求該數據。如果你的連接是TCP,我很驚訝,如果是UDP,那麼任何事情都是可能的。可能是後續的等待操作會返回未完成的數據 - 你試過了嗎? – Nim

回答

3

的epoll的信號準備,它並沒有提供有關數據量任何保證。 EPOLLIN只給你保證描述符的下一次讀操作不會被阻塞,並且至少讀1個字節。
由於通常將描述符設置爲針對各種(部分特定於操作系統的)原因的非阻塞描述符,通常的習慣用法是讀取,直到返回EAGAIN。如果這比預期的數據少(例如,如果你有一個標題爲「我的大小是100字節」的消息),那麼你將等待下一個EPOLLIN(或EPOLLHUP)並重復(或中止)。

對於TCP,接收比預期更少的數據是絕對正常的情況。重複。使用UDP,除非你提供了一個太小的緩衝區(這會放棄其餘的!),這不會發生。永遠不能。 UDP一次或全部傳送整個數據報。沒有部分交付。如果發生IP碎片,UDP會將所有碎片重新組合成一個數據報併發送整個數據報。如果一個片斷丟失,UDP將不會提供任何內容。