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);//主端复位
}
}
}
}