2012-03-07 60 views
5

我使用以下幾行代碼通過IP從外部調制解調器/路由器(又名設備)寫入和讀取。Indy TCPClient和InputBuffer中的流氓字節

TCPClient.IOHandler.Write(MsgStr); 
TCPClient.IOHandler.InputBuffer.Clear; 
TCPClient.IOHandler.ReadBytes(Buffer, 10, True); 

MsgStr是一個字符串類型,它包含我發送給我的設備的文本。 緩衝區被聲明爲TIdBytes。 我可以確認IOHandler.InputBufferIsEmpty在調用ReadBytes之前立即返回True。

我期待收到的前10個字節非常具體,因此從我的角度來看,我只對發送字符串後收到的前10個字節感興趣。

我遇到的麻煩是,當與某些設備通話時,第一個字節在建立連接後第一次發送字符串時返回在我的緩衝區輸出中放入了一個流氓(隨機)字節。接下來的字節是正確的。

例如,10個字節我期待可能是:#6A1EF1090#3但我得到的是#6A1EF1090。在這個例子中,我有一個完整的地方,不應該有一個。

如果我嘗試再次發送,它工作正常。 (即連接建立後發送的第二次寫入)。奇怪的是(對我來說)使用Socket Sniffer並不顯示返回的隨機字節。如果我創建自己的「服務器」來接收響應並將其發回,它可以在100%的時間內正常工作。其他軟件 - 即不是我的軟件 - 與設備通信良好(但我當然不知道它們是如何解析數據的)。

有沒有什麼我上面做錯了會導致這種情況 - 記住它只發生在第一次建立連接後使用寫入?

感謝

編輯

我用Delphi 7和印10.5.8

UPDATE

確定。在經過多次測試和尋找之後,我不再接近尋找這種解決方案。我得到兩個主要場景。 1 - 在接收到的數據包開始時丟失第一個字節和2 - 「引入」字節。使用TIdLogEvent和TIdLogDebug都會根據情況顯示丟失的字節或初始引入的字節。所以我上面的ReadBytes聲明一直表明Indy認爲在那裏(在我看來)。

此外,爲了進一步測試,我下載並安裝了ICS組件。不幸的是(或者幸運地取決於你如何看待它),這並沒有像Indy那樣表現出同樣的問題。這並沒有顯示第一個字節丟失,也沒有顯示一開始就引入了一個字節。然而,我只做了膚淺的測試,但Indy產生了「非常直接」的行爲,而ICS還沒有完成它。

如果有人有興趣,我可以提供一個小型的演示應用程序,說明我連接到的問題和IP--它是一個公共IP,因此任何人都可以訪問它。否則現在,我只需要解決它。我不願意切換到ICS,因爲在這種情況下ICS可以正常工作,並且由於使用這個套接字的東西幾乎是程序的關鍵,所以必須用ICS完全取代Indy將是令人討厭的。

+0

嘗試發送一個AnsiString(sizeof(char)= 1),這可能有幫助 – ComputerSaysNo 2012-03-07 06:07:24

+1

我會在哪裏放置該代碼?僅供參考,我編輯了我的問題,以顯示我使用的Delphi版本,以防萬一您認爲我以後使用的是使用Unicode的Delphi版本。 – Jason 2012-03-07 06:20:17

+0

你應該使用標籤來指定delphi版 – ComputerSaysNo 2012-03-07 06:42:05

回答

3

的最後一個參數(真)

TCPClient.IOHandler.ReadBytes(Buffer, 10, True); 

導致讀取到追加,而不是更換緩衝內容。

這要求首先正確設置緩衝區的大小和內容。

如果該參數爲False,則緩衝區內容將替換爲給定的字節數。

+0

不幸的設置爲False沒有區別 - 如果這就是你的意思。我也真/假太的情況下,幫助它沒有試圖SetLength(緩衝液,10)的各種組合。但是,鑑於真正的作品爲每個後續發送/接收,我會驚訝(儘管如此),如果有效。 :) – Jason 2012-03-07 06:56:10

1

ReadBytes()不注流氓字節到緩衝區中,只有兩種可能性,我能想到的,現在給出的有限的信息您提供:

  1. 該設備確實發送時一個額外的字節初始連接,如mj2008建議。如果數據包嗅探器未檢測到它,請嘗試將Indy自己的TIdLog...組件之一附加到您的TIdTCPClient(例如TIdLogFileTIdLogEvent),以驗證TIdTCPClient實際上是從套接字接收的。

  2. 你有另一個線程在同一時間同一連接讀,破壞InputBuffer。即使撥打TIdTCPClient.Connected()也會進行讀取。如果您正在使用線程,則不要同時在多個線程中執行讀取操作。

+0

謝謝。我會嘗試1點,看看是否提供任何見解和報告。 – Jason 2012-03-07 11:54:18