У меня проблема при работе с сокетами. У меня клиент к серверу должен отправить скриншот. Проблема в том, что сервер не получает все байты из массива, который отправляется клиентом. Постоянно не хватает 255 байт (проверено несколько раз). Соответственно, на стороне сервера я не могу выполнить преобразование из массива байтов обратно в изображение.Socket не получает все байты C# .NET
Клиент отправляет данные на сервер:
byte[] bytesforSend = ConvertBitmapToByteArray(GetScreenImage());
client.Send(bytesforSend, bytesforSend.Length, 0);
recieves сервера данных от клиента:
int lenght = cl.socket.Receive(bytes);
Может быть, все очень легко решить, но я работаю с сокетами в первый раз, и я не понимаю, почему это так.
Вы используете TCP-сокеты? Сокеты TCP: * потоковая передача * и не имеют фиксированного начала или конца сообщений, нет * пакетов * в значении, которое имеет UDP. Поэтому вы должны получать в цикле, пока не получите все данные. Кроме того, если вы читаете или записываете изображение, его нужно выполнять в двоичном режиме, а не в текстовом режиме. –
@Joachim Pileborg Я использую TCP-сокет. Попытка получить в цикле. 'Список recievingBytes = новый Список (); Список lenghts = new Список (); int length; do { lenght = cl.socket.Receive (bytes); recievingBytes.Add (байты); lenghts.Add (длина); } while (lenght! = 0); 'Что я делаю неправильно? Первый массив в списке имеет элементы, второй 0 ... –
Vitaly
Я не понимаю, как то, что вы говорите, может иметь смысл - поскольку 'bytes' является' Byte [] ', и вы, похоже, не являетесь воссоздавая его, вы добавляете * массив * объект массива в 'receiveBytes' несколько раз, и его содержимое должно быть тем, что осталось там несколькими последовательными вызовами« Получить », переписывая друг друга. –