2

我在 TIdTCPServer 的 OnExecute 中有以下代码(安装随附的 Delphi 2009 和 Indy 10),这与本网站上的其他示例非常相似;

   Socket := AContext.Connection.Socket;
    if Socket.CheckForDataOnSource(10) then
    begin
      if not Socket.InputBufferIsEmpty then
      begin
        Socket.InputBuffer.ExtractToBytes(RawBytes, -1, False, -1);

        SetLength(Buffer, Length(RawBytes));
        Move(RawBytes[0], Buffer[1], Length(RawBytes));

        // Do stuff with data here...
      end;
    end;
    AContext.Connection.CheckForGracefulDisconnect;

它有时不会读取数据,因为 CheckForDataOnSource(10) 返回 False。但是,如果我在该行停止调试器,我可以看到我在 InputBuffer 的字节中发送的数据。是否有任何其他设置我应该做的事情或其他方法来强制它一直工作。此代码运行了很多次,但在 CheckForDataOnSource(10) 上总是失败。

另外作为旁注,我注意到在 Indy 的代码中,有些人抓住了 AContext.Connection.IOHandler 而不是 AContext.Connection.Socket 并做与上面的代码相同的事情,什么是“正确”的使用。

谢谢

布鲁斯

4

2 回答 2

5

代码应该更像这样:

var
  IO: TIdIOHandler.
  Buffer: RawByteString;
begin
  IO := AContext.Connection.IOHandler;

  if IO.InputBufferIsEmpty then
  begin
    IO.CheckForDataOnSource(10);
    if IO.InputBufferIsEmpty then Exit;
  end;

  IO.InputBuffer.ExtractToBytes(RawBytes, -1, False, -1);     
  // or: IO.ReadBytes(RawBytes, -1, False);

  SetLength(Buffer, Length(RawBytes));
  BytesToRaw(RawBytes, Buffer[1], Length(RawBytes));
  // Do stuff with Buffer here...
end;
于 2009-10-05T22:05:50.937 回答
0

看起来你的代码应该是这样的;

Socket := AContext.Connection.Socket;
Socket.CheckForDataOnSource(10);
if not Socket.InputBufferIsEmpty then
begin
  Socket.InputBuffer.ExtractToBytes(RawBytes, -1, False, -1);

  SetLength(Buffer, Length(RawBytes));
  Move(RawBytes[0], Buffer[1], Length(RawBytes));

  // Do stuff with data here...
end;
AContext.Connection.CheckForGracefulDisconnect;

你抓住什么 IOHandler 并不重要,所以通用的似乎是可行的。

很抱歉回答我自己的问题,但这可能对某人很有帮助……也许吧。

于 2009-10-02T06:23:33.807 回答