第一個問題:爲什麼我在Indy套接字9 IdTcpServer ServerExecute中獲得AccessViolation?
以下例程是否正確實現了Indy 9 IdTcpServer.OnExecute例程?
procedure TMyConnServer.ServerExecute(AContext: TIdPeerThread);
var
buffSize: integer;
str: string;
begin
AContext.Connection.ReadFromStack(True, 600, False);
buffSize := AContext.Connection.InputBuffer.Size;
if (buffSize > 0) then
{ Extract input buffer as string }
str := AContext.Connection.ReadString(buffSize);
{ Notify connection object of received data }
if (AContext.Data <> nil) then
begin
TConnectionHandler(AContext.Data).Read(str);
end;
end;
end;
二(實際上更重要的)問題:
現在有偶爾訪問衝突(從地址000000讀)。顯然在行中:
AContext.Connection.ReadFromStack(True, 600, False);
但是檢查AContext/Connection/InputBuffer/IOHandler = nil BEFORE是否爲false。 調用之後(並且在異常發生後),IOHandler爲零。
我們正在使用的RAD Studio /德爾福2007年
嗨,恐怕ReadLn()是沒有選擇,因爲數據沒有換行分隔符。 我知道數據可能不完整(通常不是),但重新構建稍後在.Read(str)方法中完成。 實際上,數據類型'string'僅用於傳輸原始字節(因爲這是我們以後需要的數據)。 除了:ReadLn()可以在內部也調用ReadFromStack(),這將再次導致一個EAccessViolation ... – Tarnschaf 2009-06-19 13:06:19
如果數據有任何類型的分隔符,可以將該分隔符傳遞給ReadLn(),它不是僅限於CR/LF字符。如果數據以另一種方式分隔(例如通過指定如何讀取其餘數據的前一個標題),則必須單獨處理。使用字符串作爲原始字節緩衝區並不是一個好主意,特別是如果您升級到字符串行爲已更改的D2009。如果您需要對原始字節進行操作,則使用實際的原始字節緩衝區,如TBytes。 Indy有可用於讀取/寫入原始字節的方法。 – 2009-07-02 20:59:20