我使用以下幾行代碼通過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將是令人討厭的。
嘗試發送一個AnsiString(sizeof(char)= 1),這可能有幫助 – ComputerSaysNo 2012-03-07 06:07:24
我會在哪裏放置該代碼?僅供參考,我編輯了我的問題,以顯示我使用的Delphi版本,以防萬一您認爲我以後使用的是使用Unicode的Delphi版本。 – Jason 2012-03-07 06:20:17
你應該使用標籤來指定delphi版 – ComputerSaysNo 2012-03-07 06:42:05