我寫了一個上位機程式,來接收W5500模塊發送的資料(1/50K秒,發送16bit資料),發送接收到的資料會有丟包,用wireshark進行抓包后也證實了丟包的問題,如下圖所示

下面是我接收端的程式
private void Receive()請問出現丟包的問題是我接收端程式的問題嗎,應該怎樣修改才能不丟包。
{
byte[] buff = new byte[8 * 1024];
byte[] dataSave = new byte[1 * 1024 * 1024];
int count = 0;
string path = frm.path+"\\"+ "789.txt";
while (true)
{
if (flag)
{
Array.Clear(buff, 0, buff.Length);
int recv = SockClient.ReceiveFrom(buff, ref IP);
if (count + recv < dataSave.Length)
Array.Copy(buff, 0, dataSave, count, recv);
else
{
Array.Copy(buff, 0, dataSave, count, dataSave.Length - count);
break;
}
count += recv;
}
else //阻塞當前執行緒
{
wh.WaitOne();
}
}
write2Disk(dataSave, path);
}
uj5u.com熱心網友回復:
不允許丟包的情況,一般采用TCP通訊協議,TCP經常會出現粘包現象,通常做法是做長度校驗,每個包加入包長,一般占用2個byte用short表示,接收方收到包以后先計算包長,在截取包長位元組數存盤,接收到的包長如果小于包長,則繼續接收,如果大于包長,則截取包長資料存盤,剩余位元組數快取到下一次讀取,依次回圈uj5u.com熱心網友回復:
1.udp本身是無法保證資料不丟失的。如果要可靠,換tcp
2.建議使用異步方式接收,自己使用同步來
實作異步模式效率不高。
3.資料接收和決議推薦分離。
uj5u.com熱心網友回復:
您好,我這個是用TCP來發送和接收的,而且我接收端的處理是接受完1M的資料就停止接收然后進行保存,接收到的資料與wireshark抓包的資料都是一致的,就是在之前的wireshark截圖中的紅色部分就是發送端TCP發送失敗的情況,我就是想問下如果用異步的方式來接收是否能夠解決這個問題
uj5u.com熱心網友回復:
換成異步接收之后發現還是有丟包的問題,不過效果比同步接收的好一點,這里我貼一下我的代碼,請大家看看有沒有能夠改進的地方。這里也是接收到dataSave長度的資料后就停止接收,并進行保存。public void AsynReceive()
{
NetworkStream stream = tcp.GetStream();
Array.Clear(buff, 0, buff.Length);
stream.BeginRead(buff, 0, buff.Length, asyncResult =>
{
int len = stream.EndRead(asyncResult);
if (count + len < dataSave.Length)
{
Array.Copy(buff, 0, dataSave, count, len);
count += len;
AsynReceive();
}
else
{
tcp.Close();
write2Disk(dataSave, path);
return;
}
}, stream);
}
uj5u.com熱心網友回復:
沒人知道該怎么提高接收端接收的速度嗎uj5u.com熱心網友回復:
用while回圈來接收很不好。用4樓的方法,異步+遞回呼叫。另外,需要解包和重新組包。因為tcp有粘包的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/144204.html
標籤:C#
