我有一个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。
我被困住了。任何人都可以提供任何智慧的话语吗?
答案 0 :(得分: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)来查看客户端实际接收的内容(如果有的话)。