c # разделить и отправить буфер изображения - PullRequest
0 голосов
/ 14 ноября 2018

Моя проблема состоит в отправке байтов изображения через udp, у меня есть API, созданный строго для имитации tcp, но я тоже работаю как udp, все, что я хочу, это разделить изображение на куски и отправить каждое на сервер, последний с длиной «что осталось»

Клиентская сторона (передатчик)

using (var stream = new MemoryStream())
                {
                    Frame.Save(stream, ImageFormat.Png);

                    byte[] ImageBuffer = stream.ToArray();
                    byte[] SendBuffer = new byte[400];

                    Client.QuickMessage("SI", ImageBuffer.Length); // Start Image, buffer length

                    int lastPacketPos = 0;
                    for (int lastCounter = 0; lastCounter <= ImageBuffer.Length - 400; lastCounter += 400)
                    {
                        Buffer.BlockCopy(ImageBuffer, lastCounter, SendBuffer, 0, 400);
                        Client.SecureMessage("IP", SendBuffer, true); // Image Packet, buffer
                        lastPacketPos = lastCounter;

                        Thread.Sleep(1);
                    }

                    SendBuffer = new byte[ImageBuffer.Length - lastPacketPos];
                    Buffer.BlockCopy(ImageBuffer, lastPacketPos, SendBuffer, 0, ImageBuffer.Length - (lastPacketPos));
                    Client.SecureMessage("LP", SendBuffer, true); // Last Packet, buffer
                }

Сторона сервера (приемник)

byte[] ImageMemory;
    int bitCounter = 0;
    ShareScreenWindow ClientShareWindow = new ShareScreenWindow();
    private void Server_onReceivedData(string ClientName, string Message, object Obj)
    {
        if (Message == "SI")
        {
            ImageMemory = new byte[(int)Obj];
            Console.WriteLine("R " + (int)Obj);
            bitCounter = 0;
        }
        else if (Message == "IP")
        {
            Buffer.BlockCopy((byte[])Obj, 0, ImageMemory, bitCounter, ((byte[])Obj).Length);
            bitCounter += ((byte[])Obj).Length;
            Console.WriteLine(bitCounter);
        }
        else if (Message == "LP")
        {
            Buffer.BlockCopy((byte[])Obj, 0, ImageMemory, bitCounter, ((byte[])Obj).Length);
            using (MemoryStream ImageStream = new MemoryStream(ImageMemory))
            {
                ClientShareWindow.ShareImage.Image = Image.FromStream(ImageStream);
                ImageStream.Dispose();

            }
        }
    }

Пока ничего не работает, у меня были различные ошибки, из-за того, что счетчик был больше, чем размер буфера на стороне сервера, или ошибка Drawing.dll, пожалуйста, помогите!

Сообщения отправляются по порядку, это не проблема

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...