Получаю меньше байт, чем отправила

 
0
 
.NET
ava
Dika | 21.01.2013, 17: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();
Ответы (4)
ava
mihryak | 21.01.2013, 18:10 #
Stream.Read не гарантирует, что будут прочитаны все байты, вместо этого он возвращает количество реально прочитанных байт. Если оно равно 0, то значит пора заканчивать чтение, в остальных случаях будь готова к любому числу из диапазона 0 < n <= bufferSize.
Если твой DecodeData не завязан на определённый размер пакета, то просто передавай ему это реальное количество в виде параметра.
Иначе придётся сначала собрать все данные, а потом только нарезать на порции нужного размера и скормить их DecodeData.
ava
Dika | 21.01.2013, 18:19 #
т.е. мои данные никуда не теряются, мне тогда лучше все, что получила поместить в файл, а потом этот файл разбирать. еще инфу не искала, но и для работы файла поток и для работы сокета тоже поток, можно их как-нибудь соединить, или надо отдельный поток для записи в файл создавать
ava
mihryak | 21.01.2013, 18:23 #
не, не должны теряться
если есть возможность один поток скармливать другому, то всё вообще хорошо, никакие дополнительные файлы не нужны - просто запоминай количество прочитанных данных в буфер, а в вызове уже Write передавай тот же буфер с полученным значением

Добавлено позднее:
(я про то, что если DecodeData использует поток для записи, то этим можно воспользоваться)
ava
Dika | 21.01.2013, 18:27 #
спасибо, буду пробовать
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  mihryak   Dika
advanced
Отправить