2013-10-07 32 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

感谢Remi,我需要解引用字符串。现在它工作正常。 – Kate

相关问题