[英]TIdTCPServer not reading data from socket sometimes
我在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,並執行與上面的代碼相同的操作,什么是“正確”的代碼?使用。
謝謝
布魯斯
該代碼應該更像這樣:
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;
看起來您的代碼應如下所示;
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無關緊要,因此通用類似乎很容易。
很抱歉回答我自己的問題,但對某人可能會很有益...也許。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.