IPを介して外部モデム/ルータ(別名デバイス)に書き込み、読み取るために、次のコード行を使用しています。Indy InputBufferのTCPクライアントおよび不正なバイト
TCPClient.IOHandler.Write(MsgStr);
TCPClient.IOHandler.InputBuffer.Clear;
TCPClient.IOHandler.ReadBytes(Buffer, 10, True);
MsgStrは、デバイスに送信するテキストを含む文字列型です。 バッファはTIdBytesとして宣言されています。 IOHandler.InputBufferIsEmptyがReadBytesを呼び出す直前にTrueを返すことを確認できます。
受信した最初の10バイトが非常に具体的であると私は考えています。したがって、自分の文字列を送信した後に受信した最初の10バイトのみに興味があります。
特定のデバイスと通信するとき、最初のバイトはです。接続を確立した後に初めて文字列を送信しました。は、バッファ出力に不正な(ランダムな)バイトを入れます。後続のバイトは正しい。 #6A1EF1090#3しかし、私が取得することはある#6A1EF1090:私は期待してい
例えば10のバイトがあるかもしれません。この例では、私は完全に停止してはいけません。
もう一度送信しようとするとうまくいきます。 (すなわち、接続が確立された後に送信される第2の書き込み)。私にとって変わったのはソケットスニファを使っているのですが、返されるランダムなバイトは表示されません。私が自分の "サーバー"を作成して応答を受け取って何かを送り返すと、100%の時間がかかる。私のソフトウェアではない他のソフトウェアは、デバイスとうまく通信します(もちろん、データの解析方法はわかりません)。
これは私が最初に接続を確立した後に書き込みを使用している場合にのみ発生することに注意してください。
おかげ
EDIT
私は、Delphi 7とインディ10.5.8
UPDATE
[OK]を使用しています。多くのテストと見た目の後、私はこの解決策を見つけることにはほど遠いです。私は2つの主要なシナリオを得ています。 1 - 最初のバイトが欠落し、2 - "導入された"バイトが受信されたパケットの先頭にある。 TIdLogEventとTIdLogDebugを使用すると、不足しているバイトまたは最初に導入されたバイトが適切に表示されます。だから私のReadBytesのステートメントはIndyが信じていることを(私の意見では)一貫して示しています。
また、さらにテストするために、ICSコンポーネントをダウンロードしてインストールしました。残念なことに(またはあなたがそれをどのように見ているかによって幸いにも)、これはIndyと同じ問題を示さなかった。これは、最初のバイトが欠落していないことも、最初に導入されたバイトを示していないことも示していません。しかし、私は表面的なテストしか行っていませんが、ICSはまだそれをまったく作っていませんでしたが、Indyは "かなりまっすぐに"行動を作り出しています。
誰かが興味があれば、私は問題とIPに接続する小さなデモアプリケーションを提供できます。誰でもアクセスできるようにパブリックIPです。そうでなければ、私はただそれを回避する必要があります。私はICSに切り替えるのは嫌です。このインスタンスではICSがうまくいくかもしれません。このソケットの使用は、プログラム全体の要点であり、インディをICSで完全に置き換える必要があります。
AnsiString(sizeof(char)= 1)を送信しようとすると、それは役に立ちます – ComputerSaysNo
どこにコードを配置しますか?参考までに、私はあなたがUnicodeを使用するDelphiのそれ以降のバージョンを使用していると思った場合に使用しているDelphiのバージョンを表示するよう質問を編集しました。 – Jason
タグを使用してデルファイバージョン – ComputerSaysNo