2016-03-21 110 views
1

我正在使用主要使用select()超時阻塞套接字的應用程序,但是使用Write函數,我正在使用send()的非阻塞套接字。我只需要知道,在什麼(和所有)情況下會發送()返回EWOULDBLOCK/EAGAIN?什麼時候send()會返回EWOULDBLOCK?

+1

我不確定我是否理解這個問題,否則可能你不理解文檔。如果套接字處於非阻塞模式,則send()將返回EAGAIN或EWOULDBLOCK,並且由於某種原因該調用將被阻塞。規範沒有更詳細的說明,細節在任何情況下都是特定於實現的。對於某些實現來說,這意味着發送緩衝區中沒有足夠的可用空間來容納整個消息,但緩衝區細節又是實現特定的。 –

+1

@JohnBollinger對於所有實現。文檔中提到了發送緩衝區。它們不是實現細節。 – EJP

回答

2
send()

Linux手冊頁說:

當消息不適合套接字的發送緩衝區, 的send()正常塊,除非插座被放置在 非阻塞I/O模式。在非阻塞模式下,在這種情況下,它將失敗,並出現EEGAIN或EWOULDBLOCK錯誤 。 select(2)調用可用於確定何時可以發送更多數據。

返回值EAGAIN或EWOULDBLOCK:套接字被標記非阻塞和 請求的操作將阻止。 POSIX.1-2001允許任一錯誤以 作爲這種情況返回,並且不要求這些常量以 具有相同的值,因此便攜式應用程序應該檢查兩個 的可能性。

相關問題