TClientSocket: в чем разница между SendBuffer и SendStream? - PullRequest
2 голосов
/ 12 июля 2011

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

  var 
   buffer : array [0..200] of byte;
   begin
   ClientSocket1.Socket.SendBuf(buffer[0],length(buffer));
   end;

но когда я использую это, он работает нормально:

   var 
   buffer : array [0..200] of byte;
   mem_ste : TMemoryStream;
   begin
   mem_ste := TMemoryStream.Create;
   mem_ste.Write(buffer[0],length(buffer));
   ClientSocket1.Socket.SendStream(mem_ste);
   end;

Есть ли логическая причина, пожалуйста, скажите мне. Спасибо.

Ответы [ 3 ]

4 голосов
/ 12 июля 2011

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

Во втором коде вы записываете 201 байт неинициализированного мусора впоток, но затем отправка none через сокет, потому что текущее свойство Position потока все еще находится в конце потока - отправлять нечего.SendStream начинается с текущей позиции потока и читает, пока не достигнет конца.

0 голосов
/ 12 июля 2011

Нет ничего плохого в том, что вы используете SendBuf() (при условии, что сами данные точны), поэтому проблема должна быть связана с чем-то другим.Вы получаете событие OnError?

0 голосов
/ 12 июля 2011

Есть ли возможность исключения в SendBuf?Справка Delphi имеет следующее:

Если при записи в соединение возникает ошибка, SendBuf завершает соединение и вызывает исключение ESocketError.

Другая идея - это ваш сокет врежим блокировки?В противном случае SendBuf может завершиться ошибкой, если вызывается не в onWrite обработчике событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...