Delphi 7 и Indy 9 записывают данные с TCPServer

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

procedure TdmServer.OnExecuteTCPServer(AThread: TIdPeerThread);
var
  IncomingPacket : string;
  ResponsePacket : string;
begin
  IncomingPacket := AThread.Connection.Readln(#$03);

  if IncomingPacket <> '' then
  begin
    ResponsePacket := ProcessTelegram(IncomingPacket);

    AThread.Connection.writeln(ResponsePacket);
  end;

  AThread.Connection.Disconnect;
end;

Это почти работает нормально, за исключением добавления конца строки CRLF при отправке, что не нравится клиенту (не под моим контролем).

Поэтому я изменил его на:

AThread.Connection.Write(ResponsePacket);

и ничего не получено на клиенте.

Затем я попытался

AThread.Connection.WriteBuffer(ResponsePacket, length(ResponsePacket), true);

чтобы попытаться заставить его писать немедленно, но он все еще не отправляет вообще.

Я вставил задержки, попытался открыть буфер, сбросить его и снова закрыть (как файл справки), но все равно без радости, и каждый раз, когда вызывается FlushWriteBuffer, я получаю AV.

Я застрял. Пожалуйста, может ли кто-нибудь предложить какие-либо слова мудрости?


person Kate    schedule 07.10.2013    source источник


Ответы (1)


ReadLn() удаляет терминатор из своего результата. Ваш ProcessTelegram() отвечает за это? Если ему нужен терминатор, вам придется добавить его обратно вручную, например:

ProcessTelegram(IncomingPacket + #03)

Правильно ли форматируется ResponsePacket для того, что ожидает клиент? Если клиент не ожидает завершения CRLF, то правильно использовать Write() вместо WriteLn().

Если вы используете WriteBuffer(), вы должны разыменовать строку, чтобы передать правильный адрес данных в WriteBuffer(), например:

WriteBuffer(ResponsePacket[1], Length(ResponsePacket), True)

Or:

WriteBuffer(PChar(ResponsePacket)^, Length(ResponsePacket), True)

Если клиент по-прежнему не получает ответ правильно, то либо вы вообще ничего не отправляете, либо вы отправляете не тот терминатор, который ожидает клиент. Используйте анализатор пакетов, например Wireshark, чтобы увидеть, что на самом деле получает клиент.

person Remy Lebeau    schedule 07.10.2013
comment
Спасибо, Реми, мне нужно было разыменовать строку. Теперь он работает нормально. - person Kate; 07.10.2013