2013-10-07 34 views
1

我有一個Delphi程序,它作爲一個服務器接收數據併發回小的確認數據包。我先前使用這個代碼(編輯爲簡潔起見)Delphi 7和Indy 9從TCPServer寫入數據

procedure TdmServer.OnExecuteTCPServer(AThread: TIdPeerThread); 
var 
    IncomingPacket : string; 
    ResponsePacket : string; 
begin 
    IncomingPacket := AThread.Connection.Readln(#$03); 

    if IncomingPacket <> '' then 
    begin 
    ResponsePacket := ProcessTelegram(IncomingPacket); 

    AThread.Connection.writeln(ResponsePacket); 
    end; 

    AThread.Connection.Disconnect; 
end; 

因爲它發出,其中,客戶端(未我的控制之下),不喜歡這幾乎工作得很好,除了追加線CRLF的端部。

所以我把它改爲:

AThread.Connection.Write(ResponsePacket); 

,並沒有什麼客戶端上接收。

然後我試圖

AThread.Connection.WriteBuffer(ResponsePacket, length(ResponsePacket), true); 

,試圖讓它馬上寫,但它仍然不發送的。

我把延遲,試圖打開緩衝區,沖洗並再次關閉它(如幫助文件),但仍然沒有喜悅和任何時間FlushWriteBuffer被稱爲我得到一個AV。

我被卡住了。請任何人提供任何智慧的話?

回答

1

ReadLn()從其結果剝離終止符。你的ProcessTelegram()是否解釋了這個問題?如果需要終止,你必須把它添加回去手動,如:

ProcessTelegram(IncomingPacket + #03) 

ResponsePacket被正確格式化什麼客戶期待?如果客戶不期望終止CRLF,那麼使用Write()而不是WriteLn()是正確的做法。

如果使用WriteBuffer(),必須取消引用順序的一串正確的數據地址傳遞給WriteBuffer(),如:

WriteBuffer(ResponsePacket[1], Length(ResponsePacket), True) 

或者:

WriteBuffer(PChar(ResponsePacket)^, Length(ResponsePacket), True) 

如果客戶端仍然無法接收正確的答覆,那麼要麼你根本沒有發送任何東西,要麼你沒有發送客戶端期望的終止符。如果有的話,使用Wireshark等數據包嗅探器來查看客戶端實際上正在接收的內容。

+0

感謝Remi,我需要解引用字符串。現在它工作正常。 – Kate

相關問題