如果数据报太长,UDP发送会失败,我就想分段发送,并设置尾标,由接收端处理。下面是代码,但是在接收端接收并不完整是怎么回事?(本机调试,每段发送都能收到)有时会在尾标处(" <@" + pNo + "@>" )出现乱码,那个"<"号显示不出来,初步估计是发送端的原因。下面是发送端。
public void Send(string content, string format)
{
UdpClient client = new UdpClient();
client.Connect(_ip, _port);
client.DontFragment = true;
byte[][] ndata = null;
byte[] btformat = Encoding.GetEncoding("gb2312").GetBytes(format);
byte[] data = Encoding.GetEncoding("gb2312").GetBytes(content);
byte[] sign = Encoding.GetEncoding("gb2312").GetBytes("!part");
#region 如果数据报大于1000字节,则分段
if (data.Length > 1000)
{
int pNo = data.Length % 1000 == 0 ? data.Length / 1000 : data.Length / 1000 + 1;
ndata = new byte[pNo][];
for (int i = 0; i < pNo; i++)
{
byte[] temBytes = new byte[1000];
if (i == pNo - 1)
temBytes = new byte[data.Length % 1000];
int add = 0;
for (int j = i * 1000; j < (i + 1) * 1000; j++)
{
try
{
temBytes[add] = data[j];
add++;
}
catch
{
goto Add;
}
}
goto Add;
Add:
ndata[i] = temBytes;
//btformat.CopyTo(ndata[i], 0);
ndata[i] = CopyTo(btformat, ndata[i]);
byte[] te = ndata[i]; if (i != (pNo - 1))
{
sign = Encoding.GetEncoding("gb2312").GetBytes(" <@" + pNo + "@>" + "[" + i + "]" + "!part");
//sign.CopyTo(ndata[i], ndata[i].Length);
ndata[i] = CopyTo(ndata[i], sign);
}
else
{
sign = Encoding.GetEncoding("gb2312").GetBytes(" <@" + pNo + "@>" + "[" + i + "]" + "!end");
//sign.CopyTo(ndata[i], ndata[i].Length);
ndata[i] = CopyTo(ndata[i], sign);
}
}
}
#endregion
//如果ndata为空,则表示发送字符串小于要求值,直接发送
if (ndata == null)
{
data = Encoding.GetEncoding("gb2312").GetBytes(format + content);
client.Send(data, data.Length);
client.Close();
}
else
{
for (int i = 0; i < ndata.Length; i++)
{
//Send(ndata[i]);
client.Send(ndata[i], ndata[i].Length); }
client.Close();
}
}
byte[] CopyTo(byte[] source1, byte[] source2)
{
byte[] tem = new byte[source1.Length + source2.Length];
source1.CopyTo(tem, 0);
source2.CopyTo(tem, source1.Length);
return tem;
}
public void Send(string content, string format)
{
UdpClient client = new UdpClient();
client.Connect(_ip, _port);
client.DontFragment = true;
byte[][] ndata = null;
byte[] btformat = Encoding.GetEncoding("gb2312").GetBytes(format);
byte[] data = Encoding.GetEncoding("gb2312").GetBytes(content);
byte[] sign = Encoding.GetEncoding("gb2312").GetBytes("!part");
#region 如果数据报大于1000字节,则分段
if (data.Length > 1000)
{
int pNo = data.Length % 1000 == 0 ? data.Length / 1000 : data.Length / 1000 + 1;
ndata = new byte[pNo][];
for (int i = 0; i < pNo; i++)
{
byte[] temBytes = new byte[1000];
if (i == pNo - 1)
temBytes = new byte[data.Length % 1000];
int add = 0;
for (int j = i * 1000; j < (i + 1) * 1000; j++)
{
try
{
temBytes[add] = data[j];
add++;
}
catch
{
goto Add;
}
}
goto Add;
Add:
ndata[i] = temBytes;
//btformat.CopyTo(ndata[i], 0);
ndata[i] = CopyTo(btformat, ndata[i]);
byte[] te = ndata[i]; if (i != (pNo - 1))
{
sign = Encoding.GetEncoding("gb2312").GetBytes(" <@" + pNo + "@>" + "[" + i + "]" + "!part");
//sign.CopyTo(ndata[i], ndata[i].Length);
ndata[i] = CopyTo(ndata[i], sign);
}
else
{
sign = Encoding.GetEncoding("gb2312").GetBytes(" <@" + pNo + "@>" + "[" + i + "]" + "!end");
//sign.CopyTo(ndata[i], ndata[i].Length);
ndata[i] = CopyTo(ndata[i], sign);
}
}
}
#endregion
//如果ndata为空,则表示发送字符串小于要求值,直接发送
if (ndata == null)
{
data = Encoding.GetEncoding("gb2312").GetBytes(format + content);
client.Send(data, data.Length);
client.Close();
}
else
{
for (int i = 0; i < ndata.Length; i++)
{
//Send(ndata[i]);
client.Send(ndata[i], ndata[i].Length); }
client.Close();
}
}
byte[] CopyTo(byte[] source1, byte[] source2)
{
byte[] tem = new byte[source1.Length + source2.Length];
source1.CopyTo(tem, 0);
source2.CopyTo(tem, source1.Length);
return tem;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货