C#udp发送接收问题

做一只好猿 2015-07-30 04:44:01
我现在的一个项目,是用C#UDP写的,我是主端,要求为了维持通信,我先发0给下位机。如果下位机收到,则回0给我,然后就这样从1一直发到255,即我发1,如果对方收到1,则再回给我1,然后我继续发2,一直到255,到255之后又从1重新开始,发送的内容为三个字节,第一个是1到255,后边两个字节时消息长度,也就是说如果长度大于三,则作为消息长度处理,以下是我的代码,现在问题是收到的数据不全,比如能收到1,就收不到2和3,求大神帮忙看看
private void ReceiveHandle1()
{
//接收数据处理线程
if (mySocket1 == null || mySocket1.Available < 1)
{
Thread.Sleep(200);
}
//接收UDP数据报,引用参数RemotePoint获得源地址
rlen1 = mySocket1.ReceiveFrom(receiveBytes1, ref RemotePoint1);
while (NormalFlag1 == true)
{
cirSendBytes1[0] = (byte)0; //先发0,如果对方收到0.并回复我0,则正常(纯通讯包)
mySocket1.SendTo(cirSendBytes1, cirSendBytes1.Length, SocketFlags.None, RemotePoint1);
if (cirSendBytes1[0] == receiveBytes1[0])
{
if (rlen1 > 3)
{
manualtransform(receiveBytes1, rlen1); //作为消息函数处理
NormalFlag1 = false;
break;
}
NormalFlag1 = false;
break;
}
}

while (RunningFlag1)
{

for (int i = 1; i <= 5; i++)
{
if (mySocket1 == null || mySocket1.Available < 1)
{
Thread.Sleep(200);
continue;
}
//接收UDP数据报,引用参数RemotePoint获得源地址
rlen1 = mySocket1.ReceiveFrom(receiveBytes1, ref RemotePoint1);

cirSendBytes1[0] = (byte)i;
mySocket1.SendTo(cirSendBytes1, cirSendBytes1.Length, SocketFlags.None, RemotePoint1);

if (cirSendBytes1[0] == receiveBytes1[0])
{
if (rlen1 > 3)
{
MessageBox.Show("成¨功匹配");
//manualtransform(receiveBytes1,rlen1);
convert1(receiveBytes1);
continue;
}
System.Threading.Thread.Sleep(50);//没什么意思,单纯的执行延时 ,一个周期为50ms
continue;
}
else if ((cirSendBytes1[0] != receiveBytes1[0]) && (cirSendBytes1[0] != (byte)0))//
{
MessageBox.Show("没?收º?到Ì?,ê?再¨´发¤¡é");
System.Threading.Thread.Sleep(200);//等待4个周期,看是否能收到,收到则继续,收不到则重发
// rlen1 = mySocket1.ReceiveFrom(receiveBytes1, ref RemotePoint1); //再收
if (cirSendBytes1[0] == receiveBytes1[0])
{
continue; //收到了
}
else
{
mySocket1.SendTo(cirSendBytes1, cirSendBytes1.Length, SocketFlags.None, RemotePoint1);//没收到,重发
}
}
else
{
MessageBox.Show("主¡Â端?复¡ä位?");
byte a = 0x01;
cirSendBytes1[0] = Convert.ToByte(cirSendBytes1[0] + a);
mySocket1.SendTo(cirSendBytes1, cirSendBytes1.Length, SocketFlags.None, RemotePoint1);//主端复位
}
}
}
}
...全文
269 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2015-08-06
  • 打赏
  • 举报
回复
看到了Thread.Sleep(200);和while循环 就知道这东西不扛用 学习一下异步接收,效率会高很多,不会无端的阻塞 如果数据量不大的话,改成异步很可能就直接解决了你粘包丢包的问题 如果数据量很大,比如每个数据包超过了1M,那么UDP的方式会很不稳定,容易丢包,建议改为TCP
拜一刀 2015-08-06
  • 打赏
  • 举报
回复
收到信息,异步把收到的东西交给某函数处理,然后立刻准备继续接受 有时候不是收到的不全,是来不及处理
xian_wwq 2015-08-06
  • 打赏
  • 举报
回复
引用 4 楼 a3282697 的回复:
[quote=引用 2 楼 xian_wwq 的回复:] 网络通讯对时间非常敏感 数据接收和数据解析必须分离
怎么分离呢?不是收到之后就要处理吗?能说的在具体一点吗?多谢[/quote] udp丢包正常,要保证数据完整,还得tcp吧
xian_wwq 2015-08-06
  • 打赏
  • 举报
回复
引用 4 楼 a3282697 的回复:
[quote=引用 2 楼 xian_wwq 的回复:] 网络通讯对时间非常敏感 数据接收和数据解析必须分离
怎么分离呢?不是收到之后就要处理吗?能说的在具体一点吗?多谢[/quote] 就是把接收和解析过程异步化 最简单的方法: 接收线程接收数据后,放入线程安全的容器,然后返回; 或者完成简单的粘包处理后返回。 解析线程从容器中取数据,进行业务层的功能解析并进行后续处理。
做一只好猿 2015-08-06
  • 打赏
  • 举报
回复
引用 2 楼 xian_wwq 的回复:
网络通讯对时间非常敏感 数据接收和数据解析必须分离
怎么分离呢?不是收到之后就要处理吗?能说的在具体一点吗?多谢
fudapeng7 2015-07-31
  • 打赏
  • 举报
回复
你要分清TCP和UDP的区别,对数据丢失有要求的话就用TCP
xian_wwq 2015-07-30
  • 打赏
  • 举报
回复
网络通讯对时间非常敏感 数据接收和数据解析必须分离
caoqinghua 2015-07-30
  • 打赏
  • 举报
回复
粘包了吧.你这个很像看门狗功能为什么不用tcp呢.udp本身就是不稳定的.

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧