1. 程式人生 > >TCP網路程式設計心得體會淺談

TCP網路程式設計心得體會淺談

**在tcp程式設計中,我們以服務端為傳送端,客戶端為接收端舉例。通訊過程中傳送端和接收端都有一個接收緩衝區和傳送緩衝區(也就是說一邊兩個緩衝區),在程式設計過程中當我們使用send方法的時候所做的工作就是—-將程式中的資料傳送到計算機核心的傳送緩衝區,而當我們使用recv()方法時就是—將接收緩衝區中的資料讀取到程式中。而真正的資料互動就是tcp協議和計算機核心去完成了與我們的程式設計程式無關。
下面說幾種情況:**

1、傳送端多次傳送的資料,接收端可一次接受,說明tcp訊息是沒有訊息邊界的,
同時也說明tcp程式設計不是傳送端傳送一次訊息對應接收端接收一次訊息,同時還說
明接收端和傳送端都有相應的收發緩衝區(tcp全雙工)。

2
、當自身接收緩衝區存在資料時,自身此時關閉socket物件,也就是說接收緩 衝區還有資料沒有被應用程式讀時,會直接傳送RST包到對端,有可能導致對端的 應用程式正在讀取tcp緩衝區資料,卻突然收到RST包,導致對端tcp丟棄傳送和 接收緩衝區裡的所有資料,應該程式會丟資料。 3、當自身接收緩衝區存在資料時,對端此時關閉socket物件,此時斷開連線, 但是還是可以從自身接收緩衝區中讀取資料,不受影響。 4、如果在close時,傳送緩衝區中有資料還沒有傳送出去,本端應用程式無法確認, 對端tcp是否能收到(僅由tcp的機制實現安全交付) 5send()只是負責拷貝,拷貝完立即返回,不會等待發送和傳送之後的ACK。 如果socket
出現問題,RST包被反饋回來。在RST包返回之時,如果send()還 沒有把資料全部放入核心或者傳送出去,那麼send()返回-1,errno被置錯誤 值;如果RST包返回之時,send()已經返回,那麼RST導致的錯誤會在下一次 send()或者recv()呼叫的時候被立即返回。

**

**

概念上容易疑惑的地方

(出自於http://www.cnblogs.com/my_life/articles/5363527.html再次深入理解TCP網路程式設計中的send和recv)

**

**1. TCP協議本身是為了保證可靠傳輸,並不等於應用程式用tcp傳送資料就一定是可靠的,必須要容錯;
2
. send()和recv()沒有固定的對應關係,不定數目的send()可以觸發不定數目的recv(),這話不專業,但是還是必須說一下,初學者容易疑惑; 3. 關鍵點,send()只負責拷貝,拷貝到核心就返回,我通篇在說拷貝完返回,很多文章中說send()在成功傳送資料後返回,成功傳送是說發出去的東西被ACK確認過。send()只拷貝,不會等ACK; 4. 此次send()呼叫所觸發的程式錯誤,可能會在本次返回,也可能在下次呼叫網路IO函式的時候被返回。**

歡迎指正!!!謝謝