2009-10-02 48 views
2

我在TIdTCPServer的OnExecute(Delphi 2009和Indy 10附帶的安裝中)中有以下代碼,它與本網站上的其他示例非常相似;TIdTCPServer不能從套接字讀取數據有時

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

僅供參考,印第安納波利斯10與D2009附帶的構建中有臭蟲分別固定在印第安納波利斯的SVN以後的快照。你應該考慮升級你的Indy安裝。 – 2009-10-05 22:06:29

回答

4

的代碼應該是更多這樣的:

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; 
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並不重要,所以通用的一個看起來像走了。

對於回答我自己的問題感到抱歉,但對某個人來說可能是有利的......也許。