拆分以适应数据包c#UDP

时间:2013-07-27 10:44:04

标签: c# split size package

如何将数据包拆分成更小的部分,然后发送? 目前我尝试过手动操作,例如图像。

我会有2个udp客户端,有一个图像,让我们说800x600。 发送1 udp客户端800x300,另一个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)的东西,尝试搜索它,但我不明白。

1 个答案:

答案 0 :(得分:0)

在您的情况下,我认为更好的方法是使用TCP而不是UDP。

UDP不保证对方将收到所有数据包,并且将以与发送时相同的顺序接收它们。我想这就是为什么你同时使用两个不同的客户端?使用这种方法,您必须自己管理数据包(拆分,重组,确保收到所有数据包等)。

TCP适用于大型传输。它将为您提供开箱即用的排序,碎片,流量控制等。还有一些开销,但我想这对您的情况没有任何影响。

http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(v=VS.71).aspx http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=VS.71).aspx