假如說我有一個byte陣列大小1024
我的快取大小是250
如果每次發送200資料,發送5次
不會說第二次發送的會有一點沾到第一次的上面
假如說我有一個byte陣列大小1024M (特別大)
我的快取大小是250M (特別大)
如果每次發送200M資料,發送5次
會不會在接收時第二次發送的會有一點沾到第一次的上面?
uj5u.com熱心網友回復:
粘包無法完全避免。有兩種處理辦法一種是S端寫成WEB專案,C端去調HTTP介面,這種情況下能避免粘包的情況,不需要你來處理,完全由WEB服務器來;
還有一種就是定義自己的資料結構,拼完包,根據資料結構來決議資料。
比如兩條訊息被拆成了三個包:
<BEGIN>資料1<EN
D><BEGIN>數
據2<END>
收到了先扔快取拼起來,然后再決議。
uj5u.com熱心網友回復:
你看這樣行嗎:
我先發送資料大小,
然后發送資料 ( 沒有前后標示 )
當C接收到資料大小之后的資料直到等于資料大小后為接收完畢
我做的是檔案傳輸
1.DAT檔案名LENGTH1024
2.回圈發送檔案
3.關閉檔案
C需要做的是:
1.接收檔案名以及檔案大小
2.接收檔案資料并比較是否接收至檔案大小
3.保存檔案
斷開網路連接
uj5u.com熱心網友回復:
這么設計沒問題uj5u.com熱心網友回復:
感謝了^_^ ,
我再想想實作
uj5u.com熱心網友回復:
對于是否在對端接收時,第一次接收的是否含有對端兩次的發送;主要看你的發送間隔,如果你的間隔較小,比如發完第一個200Byte,就直接發第二個200Byte;那么對端一次接收很有可能含有第二次的200Bytes,如果間隔較大, 比如1s,那么接收含有第二次發送的200Bytes的可能性比較小了。跟其發送間隔有關系。如果不想有交叉,即第一發送,保證對端收完,此時再發送第二個200,那么建議可以每發送一次200,可以延長間隔,或者讓對端發一個接收資料的回應包,本端收到回應包繼續發送下一個200
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/116939.html
標籤:網絡通信
上一篇:C# Modbus tcp
下一篇:5分鐘搞定快速排序
