2011-10-30 24 views
3

當我在阻塞模式下創建TCP套接字並使用send(或sendto)函數時,函數調用將返回嗎?阻塞模式下的Linux TCP套接字

是否必須等到套接字的另一端收到數據?在這種情況下,如果互聯網上有交通堵塞,它可能會長時間阻塞嗎?

回答

3

發送方和接收方(以及可能的中介)都將緩衝數據。

成功發送數據並不能保證接收端已收到數據。

通常寫入到阻塞插座,只要有在發送側緩衝空間不會阻塞。

一旦發件人的緩衝區已滿,那麼寫入將被阻塞,直到有在它整個寫空間。

如果寫入部分成功(接收器關閉套接字,它關閉或發生錯誤),然後寫可能會返回比你原來打算的字節數更少。後續寫入應該給出錯誤或返回0 - 這些條件在TCP套接字上不可逆。

注意,如果後續的send()或write()給出了一個錯誤,然後一些先前寫入的數據可能會永遠失去了。我不認爲有一種真正的方法可以知道實際到達了多少數據(或者已被確認)。

+1

在阻塞模式下寫入不能返回零。要麼寫東西,要麼你得到-1和一個errno。 – EJP

+0

@EJP:如果對方正常關閉連接,寫入CAN將返回零。不正常的斷開會導致-1。 –

+2

@ RemyLebeau-TeamB編號僅在read()和recv()上。寫入()或發送()到關閉的連接將最終返回-1與errno == ECONNRESET。 – EJP