巨大的问题------------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
这个是主程序的代码 。
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
这个是主程序的代码 。
...全文
相关推荐
UDP协议中的 UDP Flood 攻击详细讲解
这些服务在正常情况下向特定地址响应请求,但在被利用后,响应的数据包会被发送到目标服务器,造成巨大的流量冲击。UDP报文结构简单,只包含头部和数据字段,因此无法提供数据包的可靠传输保证。
基于UDP协议的视频图像传输的研究与实现
#### 扩展UDP协议以适应视频传输需求为了解决上述问题,研究人员对UDP协议进行了扩展。
udp概述、原理及应用.pdf
### UDP 报文结构UDP报文结构简单明了:- **源端口号和目的端口号:** 用于标识数据包的来源和目的地。- **长度字段:** 指明整个UDP数据报的长度。
基于UDP协议P2P通信技术的分析及实现
尽管如此,UDP以其高效的数据传输能力,在实时通信场景中展现出巨大的优势。
SocketTool TCP UDP 客户端 服务端 各种调试 很强大的工具! 亲测好用!
总之,SocketTool是一个实用的工具,无论是对初学者还是经验丰富的开发者来说,都能在TCP和UDP的调试过程中提供巨大的便利。


