2014-01-20 29 views
0

我在Linux C程序中使用TCP流套接字來傳輸數據。我的問題是:丟包會發生什麼?Linux C流套接字中的TCP機制

Linux套接字是否實現TCP數據包恢復機制,以便丟失的數據包在超時後重新發送? 或者我是否必須檢查返回值send(),並在數據爲零時重新發送數據?

+3

TCP處理它,這就是它的全部目的......所有這些ACK和窗口和框架「N」垃圾......但你必須檢查返回值... –

+0

想想看 - 它*必須*處理數據包丟失 - 否則API中存在嚴重的錯誤,因爲它提供了一個流接口! API根本無法爲您提供足夠的信息來重新發送自己,即使您想要。 –

回答

4

如果您使用的是TCP套接字或unix域套接字(在文件系統中出現「s」作爲文件類型,當您使用ls -l時),您的問題並不清楚。但是在這兩種情況下,答案都是肯定的,它們實現了數據包恢復(然而,在unix套接字中丟失/恢復的數據並不多),並且不,您不必重新發送數據。

但是您仍然應該檢查send()是否存在錯誤;由於某人剛剛拔掉了網線,或者您的send()可能會溢出內部緩衝區,導致部分發送(還有很多其他原因以及發送可能出錯的原因),連接可能會關閉。但是一旦你完成了send(),並且它的返回值並不表明它「忘記」了一些數據,那麼就完成了。

注意,連接可能您發送電子郵件後仍突破()結束,接收端收到所有數據之前。檢查的唯一方法是讓接收方確認數據,並在發送方檢查確認。 (我不是在這裏談論TCP ACK)。但是,接收器獲取所有數據之後,在獲得完整的ACK之前,您的連接可能會中斷。如果你真的需要防範這種情況,那麼你必須實現一些交易方案,在連接中斷後重新連接,並要求接收方處理哪些交易並重新發送其他交易方案。