我在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并做了与上面代码相同的事情,那是什么“对“一个人使用。
谢谢
布鲁斯
答案 0 :(得分: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;
答案 1 :(得分: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并不重要,所以通用的就好了。
对于回答我自己的问题感到很抱歉,但对于某些人来说可能很有意思......也许。