2011-12-20 4 views
2

Этот код работает:clientStream.Read возвращает неверное число байтов

TcpClient tcpClient = (TcpClient)client; 
NetworkStream clientStream = tcpClient.GetStream(); 
byte[] message = new byte[5242880]; 
int bytesRead; 

bytesRead = clientStream.Read(message, 0, 909699); 

Но это возвращает неверное число байтов:

bytesRead = clientStream.Read(message, 0, 5242880); 

Почему? Как я могу это исправить?

(реальный размер данных 1475186, код возвращает 11043, как количество байтов)

+11

Что означает, когда вы говорите «не работает»? –

+0

И каждый раз, когда он возвращает новый номер для количества байтов – armin

+3

Возможно, данные не отправляются сразу, а скорее делятся на пакеты. И те 11043 - размер первого пакета. Поэтому вам, вероятно, придется создать цикл вокруг 'Read'. – duedl0r

ответ

7

Если это поток на основе TCP, то ответ, что остальные данные просто не поступало все же.

TCP ориентирован на поток. Это означает, что нет никакой связи между количеством звонков /Write и количеством событий приема. Несколько записей могут быть объединены вместе, и отдельные записи могут быть разделены.

Если вы хотите работать с сообщениями на TCP, вам нужно реализовать собственный алгоритм пакетной обработки поверх него. Типичные стратегии для достижения этой цели являются:

  1. Приставка каждым упакованных по длине, обычно с двоичными данными
  2. использовать последовательность разделения, такие как разрыв строки. Обычный с текстовыми данными.

Если вы хотите, чтобы прочитать все данные в блокирующем образом, вы можете использовать цикл до тех пор, пока DataAvailabletrue, но последующий вызов Read возвращается 0. (Надеюсь, что я правильно запомнил эту часть, не проделал какое-либо сетевое программирование некоторое время)

+0

Пример получения всех данных: http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read.aspx – duedl0r

+0

@ duedl0r 1) Вы отправили ссылку на перевод на немецком языке MSDN. 2) Вы уверены, что пример читается до конца? Я думаю, что он только считывает все доступные данные и, таким образом, заканчивается, если часть данных еще не наступила. – CodesInChaos

+0

1) Uh sry об этом. 2) да, он только считывает доступные данные. вы не можете ожидать большего, вам нужно реализовать алгоритм пакетной обработки, как вы описали. Я просто подумал, что вы можете дополнить свой ответ ссылкой. – duedl0r

1

Вам нужно зацикливать байты чтения из сообщения до тех пор, пока свойство Available на TCP-клиенте или свойство DataAvailable NetworkStream не будет 0 (= нет больше байт слева)

+0

'DataAvailable' является bool и, следовательно, не может быть 0. Если я правильно помню, правильный шаблон для чтения до конца проверяет' DataAvailable == true', но 'Read' возвращает' 0' после этого. – CodesInChaos

+0

@CodeInChaos True, DataAvailable - это bool. Я всегда использовал свойство Available в TCP-клиенте без проблем (пока!). – Strillo

2

из MSDN:

операции считывания считывает столько данных, сколько есть в наличии, вплоть до числа байтов, заданное параметром размера.

I.e. вы должны вызвать метод Read() в цикле, пока не получите все данные. Посмотрите на sample code in MSDN.

1

Читать Documentation:

Этот метод считывает данные в параметр буфера и возвращает число байтов успешно считаны. Если данные для чтения недоступны, метод Read возвращает 0. Операция чтения считывает столько данных , сколько доступно, до количества байтов, заданных параметром . Если удаленный хост отключает соединение, и все полученные данные получены, метод Read немедленно завершает и возвращает нулевые байты.

Таким образом, это может быть из-за сбоя соединения, которое вы получаете каждый раз по-разному, в любом случае вы можете проверить результат, чтобы узнать, является ли его причиной.

0

Я думаю, что ответы уже здесь отвечают на ваш конкретный вопрос достаточно хорошо, но, возможно, в более общем плане. Если вы пытаетесь отправить данные через объект networkStream для целей сетевой связи, просмотрите библиотеку с открытым исходным кодом, networkComms.net.

 Смежные вопросы

  • Нет связанных вопросов^_^