2012-01-17 66 views
5

當在Linux上使用阻塞套接字時,是否有任何理由讓send()返回小於請求的值,其他比中斷但部分成功的系統調用還要多?什麼時候send()返回小於length參數?

我知道,這可能是定義非常實施,而且它很可能是非常危險的依賴於這種行爲,即使沒有安裝任何信號處理(因此原因中斷的系統調用)。我可能會繞過發送電話直到完成;但是,如果有關於此事的官方言論,我將能夠避免這種情況。

Why is it assumed that send may return with less than requested data transmitted on a blocking socket?是問同樣的問題,與不確定的結果:中斷的系統調用被提及作爲短暫返回計數的例子,但目前還不清楚完整的TCP發送緩衝區是否會導致部分發送或send()只會阻塞,直到緩衝區中有足夠的空間。

回答

4

在一般情況下,如果發送緩衝器包含一定的空間,但還不足以對整個發送請求,然後它會發送儘可能多的,因爲它可以再回到實際添加到緩衝區量 - 簡評。

現在你可能會認爲阻塞(在阻塞套接字上)會更有意義,但是它不是歷史的原因 - TCP基於UNIX管道,這就是UNIX管道的工作方式。主要的原因是,它使得其他的情況(在內核中)更容易 - 你不必擔心堵做某事的系統調用in the middle;它要麼執行某些操作並立即返回,要麼直到某個事件(內核重試它從頭開始)才執行任何操作。如果有人試圖在單次寫入時寫入超過最大緩衝區大小(否則可能導致死鎖),您不必擔心會發生什麼情況。

+0

FWIW,該手冊頁'發送()'在我的Linux機器說'當消息不適合套接字的發送緩衝區,發送()正常塊,除非插座被放置在非阻塞I/O模式。在非阻塞模式下,它會失敗,錯誤EAGAIN 或EWOULDBLOCK在這個case.'它似乎沒有記錄功能的恢復比'len'參數以外的任何(或'-1'上的錯誤)。 – 2012-01-17 19:55:00

+2

Linux手冊頁非常模糊。在BSD系統上檢查頁面會更好。 RETURN VALUES部分記錄了它只返回了發送的字符數,但不保證它與請求的數字相同。 – 2012-01-25 17:01:01

相關問題