0

パケットを小さな部分に分割して送信するにはどうすればよいですか? 現在、画像など、非常に手動で実行しようとしました。

2 つの udp クライアントがあり、800x600 としましょう。1 つの udp クライアントを 800x300 で送信し、もう 1 つを 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) よりも大きなものを送信する方法がわからないためです。検索してみましたが、わかりません。

4

1 に答える 1

-1

あなたの場合、より良いアプローチはUDPの代わりにTCPを使用することだと思います.

UDP は、相手側がすべてのパケットを受信すること、および送信されたのと同じ順序で受信されることを保証しません。それが、2 つの異なるクライアントを同時に使用している理由だと思いますか? このアプローチを使用すると、自分でパケットを管理する必要があります (パケットを分割し、再組み立てし、すべてのパケットを確実に受信するようにするなど)。

大規模な転送には 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

于 2013-07-27T12:49:02.700 に答える