Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Получаю меньше байт, чем отправила


Автор: Dika 21.1.2013, 16:00
У меня клиент-серверное приложение.Протокол tcpip. Передаю файл. Размер файла 22 Кбайт. Передаю пакетами по 251 байт. Но на клиентской стороне получаю искаженные данные. Записала лог с сервера, все пакеты правильные, по 251 байт. Записала лог с клиента, один или два пакета приходят по 205 байт, а все остальные по 251 байту. Как такое может быть. Клиент и сервер находятся на одном столе. Потом, есть же контрольная сумма у протокола TCP/IP, если бы была ошибка в полученном пакете, то функция бы вернула код ошибки. 

Сервер у меня реализован на С++, клиент на С#.
Код

 byte[] data = new byte[251];
...
          stream.Write(data, 0, 8);
              Array.Clear(data, 0, 8);
                 int bytes=0;
          
                    while ((bytes=stream.Read(data, 0, data.Length)) > 0)
                    {   
                           DecodeData(data); 
                    }       
                 
                    stream.Close();

Автор: mihryak 21.1.2013, 18:10
Stream.Read не гарантирует, что будут прочитаны все байты, вместо этого он возвращает количество реально прочитанных байт. Если оно равно 0, то значит пора заканчивать чтение, в остальных случаях будь готова к любому числу из диапазона 0 < n <= bufferSize.
Если твой DecodeData не завязан на определённый размер пакета, то просто передавай ему это реальное количество в виде параметра.
Иначе придётся сначала собрать все данные, а потом только нарезать на порции нужного размера и скормить их DecodeData.

Автор: Dika 21.1.2013, 18:19
т.е. мои данные никуда не теряются, мне тогда лучше все, что получила поместить в файл, а потом этот файл разбирать. еще инфу не искала, но и для работы файла поток и для работы сокета тоже поток, можно их как-нибудь соединить, или надо отдельный поток для записи в файл создавать

Автор: mihryak 21.1.2013, 18:23
не, не должны теряться
если есть возможность один поток скармливать другому, то всё вообще хорошо, никакие дополнительные файлы не нужны - просто запоминай количество прочитанных данных в буфер, а в вызове уже Write передавай тот же буфер с полученным значением

Добавлено @ 18:24
(я про то, что если DecodeData использует поток для записи, то этим можно воспользоваться)

Автор: Dika 21.1.2013, 18:27
спасибо, буду пробовать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)