巨大的问题------------udp数据报,分包的组合 !
发送数据:
private void send()
{
// **STEP 1**创建一个UdpClient实例
udp= new UdpClient();
ip=IPAddress.Parse("192.168.1.255");
endpoint=new IPEndPoint(ip,serverport);
try
{
udp.Connect(endpoint);
string str=this.richTextBox1.Text ;
byte[] bytes =Encoding.Unicode.GetBytes(str);
//总包的大小
int totalSize=bytes.Length;
//***********小于mtu的数据包做标记直接发送****************
//如果总包超过udp的最大传输自己即MTU,则进行分包
if(totalSize<60000)
{ //数据小于60000字节,进行标记,方便Client接收
byte[] b1=new byte[totalSize+1];
b1[0]=1;
//给小于MTU的数据包做标记
Array.Copy(bytes,0,b1,1,totalSize);
udp.Send(b1,b1.Length);
}
//**************大于mtu的数据包进行分包,然后发送**********
else
{
//分包的大小
int PacketSize=60000;
//分包的数量
int PacketCount=0;
//分包个数的控制
//totalSize/PacketSize*PacketSize 只有两中情况,等于totalsize 或者是大于
if(totalSize/PacketSize*PacketSize<totalSize)
{ PacketCount=totalSize/PacketSize+1; }
else
{ PacketCount=totalSize/PacketSize; }
//数据包
byte[] data=new byte[PacketSize+1];
//开始循环发送数据包
for(int i=0;i<PacketCount;i++)
{
//分包的起始位置
int start=i*PacketSize;
//最后一个包的发送
if(i==PacketCount-1)
{
//最后一个包的大小
int LastDataPacket=(int)(totalSize-((long)(PacketSize*PacketCount)));
//最后一个数据包的起始位置
int LastDataPacketBegin=totalSize-lastDataPacket;
//给最后一个数据包的前两个自己打标
data[0]=0;
data[1]=i;
Array.Copy(bytes,LastDataPacketBegin,data,2,LastDataPacket)
udp.Send(lastdata,lastdata.Length);
}
//发送分包
else
{
//分包的标记
data[0]=i;
//填充数据包;从bytes源数组提取数据。
Array.Copy(bytes,start,data,1,data.Length);
//发送做过标记的数据包
udp.Send(data,data.Length);
}
}
catch( Exception e)
{
MessageBox.Show(e.ToString());
}
}
----------------------
数据接收:
while(true)
{
RemoteIpEndPoint=null;
try
{
byte[] receiveBytes=receive.Receive(ref RemoteIpEndPoint);
//数据小于30000字节的,处理掉标记后进行输出
if(receiveBytes[0]==1)
{
//长度减1
byte[] b1=new byte[receiveBytes-1] ;
//除去标记
Array.Copy(receiveBytes,1,b1,0,receiveBytes.Length);
//转换数据为string 并显示
string returnData=Encoding.Unicode.GetString(b1,0,b1.Length);
this.richTextBox.Text=returenData;
}
else
{
// ************************
//取得分包的数据
//并组合数据
//************************
}
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
}
}
-----------------------------
由于能力有限,在数据分包上还有很多的错误。请高手指正 !
问题是 : 在接收端,我无发把数据包再组合起来啦 。因为那是个阻塞的方式 !
当然先排除数据包丢失和顺序错误不考虑,怎么样单纯的把数据分包组合起来 ?
下一 步再解决数据包的顺序问题。谢谢啦 !
--------------------
http://blog.china-pub.com/more.asp?name=immelman&id=11692
这个是主程序的代码 。