gpt4 book ai didi

delphi - TIdTCPServer 有时不从套接字读取数据

转载 作者:行者123 更新时间:2023-12-01 16:19:03 30 4
gpt4 key购买 nike

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

   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 并执行与上面代码相​​同的操作,什么是“正确的”一个来使用。

谢谢

布鲁斯

最佳答案

代码应该更像这样:

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;

关于delphi - TIdTCPServer 有时不从套接字读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1507136/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com