我写了一个上位机程序,来接收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);
}请问出现丢包的问题是我接收端程序的问题吗,应该怎样修改才能不丢包。
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);
}请问出现丢包的问题是我接收端程序的问题吗,应该怎样修改才能不丢包。
解决方案 »
- 求C# 不卡死,不耗CPU 的延时命令。
- 请给我点思路:关于数组问题的
- 100分 文本文件字符解析 牛人帮忙 求最佳解决方案
- Diffie-Hellman密钥交换算法的实现
- List<String> myList = new List<String>()插入数据库
- microsoft .net framework sdk 2.0是什么
- 如何实现矢量图软件?
- XML转换问题,新手上路,急!!!
- c# LumiSoft.Net.POP3.Client 接收邮件,不要转网上2007-2008发出的帖子,那个部分函数已经过期 (请高手指点!!!!!!!!!!!!!!!!)
- 如何实现四舍五入
- 关于winform前端开发
- SQL查询一个月内每一个人的考勤记录同一个人的显示在当天的同一行中
如果要可靠,换tcp
2.建议使用异步方式接收,自己使用同步来
实现异步模式效率不高。
3.数据接收和解析推荐分离。
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);
}