1

我有一个 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。

我被困住了。请问有人能提供任何智慧的话吗?

4

1 回答 1

1

ReadLn()从其结果中剥离终止符。你的ProcessTelegram()会计是这样的吗?如果它需要终结器,则必须手动将其重新添加,例如:

ProcessTelegram(IncomingPacket + #03)

是否ResponsePacket按照客户的期望正确格式化?如果客户端不期望终止 CRLF,那么使用Write()代替WriteLn()是正确的做法。

如果使用WriteBuffer(),则必须取消引用 String 才能将正确的数据地址传递给WriteBuffer(),例如:

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

或者:

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

如果客户端仍然没有正确接收响应,那么要么你根本没有发送任何东西,要么你没有发送客户端期望的终止符。使用数据包嗅探器(例如 Wireshark)来查看客户端实际接收到的内容(如果有的话)。

于 2013-10-07T18:10:40.970 回答