1. 程式人生 > >關於TCP粘包和半包的處理

關於TCP粘包和半包的處理

今日,在程式設計過程中需要在區域網內不同的電腦間傳輸檔案,遇到了TCP協議的粘包和半包現象。經過思考和借鑑,找到了一個比較好的解決方法。因為在傳輸檔案時要先傳輸檔名和檔案大小,然後再傳輸檔案,所以電腦間的應用程式實現了一個小的協議。這個協議需要解碼TCP傳輸的內容。在有粘包和半包的現象時,會發現有時候檔名和大小以及檔案內容混在了一塊,有時候,檔案內容沒有傳完,就顯示接收到的資料包已經小於設定的緩衝區長度了。

         解決辦法,協議不變,將傳送和接受的資料設為定長的一幀幀的資料,比如1024個位元組,比如檔名和檔案大小需要先傳,雖然內容不滿1024個位元組,但通過增加特定字元,使內容填滿一個1024的幀,然後傳送;檔案內容傳輸的時候也是一1024個位元組為一個傳送幀大小,檔案末尾不足1024個位元組時,也用字元將1024個位元組填滿,然後發出。接收端按照1024個位元組的幀大小提取每一幀。在開始接受到的第一幀中提取檔名和檔案大小,然後繼續接受檔案內容,並利用第一幀獲得的檔案大小來判斷是否該結束寫入,應寫入多少位元組。

         通過這個辦法,較好的解決了TCP協議粘包和半包的問題。這個方法最關鍵的一點就是傳送方和接受方使用相同的幀長,這樣就把問題解決了。這個解決方法比較簡單一些,容易實現。