Моя проблема состоит в отправке байтов изображения через 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, пожалуйста, помогите!
Сообщения отправляются по порядку, это не проблема