2013-11-20 6 views
1

Я использую TcpClient и подключаю свое приложение к серверу. Этот сервер с использованием двоичных данных сериализации, так что я, отправив запрос в двоичном формате, но получить ответ вроде:Чтение двоичного ответа с сервера

enter image description here Существует мой код:

TcpClient client = new TcpClient("173.240.5.1", 443); 
     NetworkStream stream = client.GetStream(); 

     System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 

     byte[] sendBytes = encoding.GetBytes("YmFzZTY0IGVuY29kZWQgc3RyaW5n"); 

     stream.Write(sendBytes, 0, sendBytes.Length); 

     byte[] bytes = new byte[client.ReceiveBufferSize]; 
     int response_int = stream.Read(bytes, 0, client.ReceiveBufferSize); 


     Console.WriteLine(response_int); 

Пожалуйста, помогите решить эту проблему и извините за мой Английский!

+0

В какой момент вы помещаете данные в 'bytes'? –

+0

В чем проблема? – Reda

+0

«Этот сервер, использующий двоичную сериализацию данных» - можете ли вы более точно узнать, какие правила вы выполняете? В настоящее время похоже, что вы отправляете ASCII ... также: где код * receive *? –

ответ

0

Ответ, похоже, написан на Mime64. весь буфер содержит всего 0. Кажется, у вас нет ответа. Не могли бы вы подождать (Thread.Sleep(500)) перед stream.read. Обратите attantion, что ReceiveBufferSize это размер буфера, но не сумму ПОЛУЧАЛ байт

+0

«Сон» - это * ужасный способ дождаться данных сокета, p –

+0

Ответ снова 0. Может быть проблема в запросе?Описание запроса в документации: «Перед отправкой незашифрованных сообщений (требуется в этом экземпляре для создания ключа авторизации) клиент должен пройти авторизацию (p, q) следующим образом: 1) Клиент отправляет запрос на сервер req_pq # 60469778 nonce: int128 = ResPQ' –

+0

Марк, каковы возможности ожидания ответа? :) –

2
byte[] bytes = new byte[client.ReceiveBufferSize]; 
int response_int = stream.Read(bytes, 0, client.ReceiveBufferSize); 

и (комментарии) «Я получаю 0 ответ».

Возвращаемое значение от stream.Read - это количество прочитанных байтов; важные моменты:

  • это не гарантирует, что вы будете заполнить буфер
  • , если он возвращает не положительное число, нет ничего больше, чтобы читать и не будет никогда быть ничего больше читай: поток закрыт, находится на конце, EOF и т. д.
  • , если он не закрыт, гарантируется только (за исключением исключений) читать не менее один байт (и не более указанной суммы буфера) - и будет (или тайм-аут через исключение)
  • whe n получает положительное число, не гарантируется, что у вас есть целый пакет/сообщение/кадр и т. д .; все, что вы можете сказать наверняка, это то, что это «некоторые данные, это много байтов»; он также ничего не говорит вам о том больше данных прибывает в ближайшее время, или действительно ли больше данных в буфере на NIC

Таким образом, если он вернулся 0, нет данных. Ничего не получено и розетка закрыта. Неважно, как долго вы ждете: он никогда не прибудет. Без знания того, как вы настраиваете эти сокеты или что делает сервер, я не могу сказать больше. Тем не менее, возможно закрыть сокет только в одном направлении (любой из них может это сделать). Похоже, что сервер, с которым вы подключили два, закрыл свой сокет отправки (ваш приемный сокет), не отправив вам никаких данных.

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