ReceiveBuf от TCustomWinSocket не будет работать с динамическими массивами для буфера - PullRequest
2 голосов
/ 20 января 2012

Я пытаюсь получить буфер через сокет TCP с помощью компонента TServerSocket (я поддерживаю устаревшее приложение, поэтому переход на Indy или что-либо еще не обсуждается).

Iреализовали метод события OnClientRead, который читает этот буфер в неблокирующем сокете (опять же, я не могу вносить радикальные изменения в это устаревшее приложение).

Функция выглядит так:

Однако, это дает мне следующее исключение:

Asynchronous socket error 10053

Если я изменю это на следующее:

procedure TFrmMain.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  Size: Integer;
  Bytes: array[0..1024*256] of Byte;
begin
  Size := Socket.ReceiveLength;
  Socket.ReceiveBuf(Bytes, Size);
end;

Это работает.Однако динамический подход более адекватен моей проблемной области.

Что может быть причиной этого?Моя цель - прочитать двоичный буфер через сокет TCP с этим компонентом.

Заранее спасибо.

1 Ответ

2 голосов
/ 20 января 2012

Первый параметр ReceiveBuf является нетипизированным параметром var. Ему нужен прямой доступ к месту, где он начнет писать.

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

Socket.ReceiveBuf(Bytes[0], Size);

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

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