拆分以适应数据包c#UDP
本文关键字:数据包 c#UDP 拆分 | 更新日期: 2023-09-27 18:25:05
如何将数据包拆分成更小的部分,然后发送?目前,我已经尝试过手动操作,例如图像。
我会有两个udp客户,有一个800x600的图像。发送一个带有800x300的udp客户端和另一个800x300。
然后合并它们。
但我想一定有更好的方法,某种功能来实现这一点?由于大包装变得非常困难,我将不得不制作10多个udpclients。
private void Initialize()
{
Bitmap holder = new Bitmap(640, 480);
pictureBox1.Size = new System.Drawing.Size(1920, 1200);
EndPoint ourEP = new IPEndPoint(IPAddress.Any, 0);
EndPoint remoteEP = (EndPoint)(new IPEndPoint(IPAddress.Any, 1700));
EndPoint remoteEP2 = (EndPoint)(new IPEndPoint(IPAddress.Any, 1701));
udpcap = new UdpClient();
udpcap1 = new UdpClient();
udpcap.Client.Bind(remoteEP);
udpcap1.Client.Bind(remoteEP2);
}
private void Listen()
{
while (checkBox1.Checked)
{
byte[] data = udpcap.Receive(ref adress);
byte[] data2 = udpcap1.Receive(ref adress);
Bitmap bitmap = new Bitmap(byteArrayToImage(data).Width + byteArrayToImage(data2).Width, Math.Max(byteArrayToImage(data).Height, byteArrayToImage(data2).Height));
using (Graphics g = Graphics.FromImage(bitmap))
{
g.DrawImage(byteArrayToImage(data), 0, 0);
g.DrawImage(byteArrayToImage(data2), byteArrayToImage(data).Width, 0);
}
pictureBox1.BackgroundImage = bitmap;
}
}
private static Image cropImage(Image img, Rectangle cropArea)
{
Bitmap bmpImage = new Bitmap(img);
Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
return (Image)(bmpCrop);
}
private void Send()
{
bool p = true;
while (capcon == true)
{
Rectangle h = new Rectangle(0, 0, 320, 480);
Bitmap holder = new Bitmap(640, 480);
Graphics graphics = Graphics.FromImage(holder);
graphics.CopyFromScreen(0, 0, 0, 0, new Size(1920, 1200), CopyPixelOperation.SourceCopy);
byte[] u = imageToByteArray(cropImage(holder, h));
udpcap.Send(u, u.Length, adress.Address.ToString(), 1700);
h = new Rectangle(320, 0, 320, 480);
byte[] u1 = imageToByteArray(cropImage(holder, h));
udpcap1.Send(u1, u1.Length, adress.Address.ToString(), 1701);
}
}
这是代码,它所做的很简单。截取桌面的屏幕截图。将其放置在640x480位图中(不过比桌面大小小得多)。
发送2个包裹,其中包含图片的两半。
接收数据,将其组合,并将其作为背景。
现在,这适用于非常小的640x480。
现在,如果我想用更高的东西来做,我必须做很多包。所以我想知道是否有可能拥有更多的,自动的。
为什么我要拆分包并使用许多客户端,是因为我不知道如何发送比缓冲区(65kb)更大的东西,试着在上面搜索,但我不明白。
在您的情况下,我认为更好的方法是使用TCP而不是UDP。
UDP不能保证对方将接收所有数据包,也不能保证它们将按照发送时的相同顺序接收。我想这就是为什么你同时使用两个不同的客户端?使用这种方法,您将不得不自己管理数据包(拆分、重新组装、确保收到所有数据包等)
TCP更适合于大型传输。它将为您提供开箱即用的排序、碎片化、流控制等。还有更多的开销,但我想它对您的情况没有影响。
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(v=VS.71).aspxhttp://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=VS.71).aspx