2013-10-07 3 views
1

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

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.

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

ответ

1

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

ProcessTelegram(IncomingPacket + #03) 

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

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

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

Или:

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

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

+0

Спасибо Реми, мне нужно было разыменовать строку. Теперь он работает нормально. – Kate

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

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