2012-03-07 5 views
5

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で完全に置き換える必要があります。

+0

AnsiString(sizeof(char)= 1)を送信しようとすると、それは役に立ちます – ComputerSaysNo

+1

どこにコードを配置しますか?参考までに、私はあなたがUnicodeを使用するDelphiのそれ以降のバージョンを使用していると思った場合に使用しているDelphiのバージョンを表示するよう質問を編集しました。 – Jason

+0

タグを使用してデルファイバージョン – ComputerSaysNo

答えて

3

最後のパラメータ(真)

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

ではなく、バッファの内容を置き換えるのアペンドへの読み取りが発生します。

これには、バッファのサイズと内容が最初に正しく設定されている必要があります。

パラメータがFalseの場合、バッファの内容は指定されたバイト数に置き換えられます。

+0

残念ながら、それをFalseに設定しても何の違いもありません。私はSetLength(Buffer、10)とTrue/Falseの組み合わせも試してみました。しかし、その後の送受信のたびにTrueが動作すると、うまくいけば驚いたでしょう(幸いです)。 :) – Jason

1

ReadBytes()はバッファに不正なバイトを注入していないので、あなたが提供してきた私が今与えられた限られた情報の考えることができる唯一の2つの可能性があります

  1. 本当に時に余分なバイトを送信しているデバイス最初の接続は、mj2008のように提案されました。パケットスニッファがそれを検出していない場合は、TIdLogFileまたはTIdLogEventなどのTIdTCPClientにIndy独自のTIdLog...コンポーネントの1つを添付して、実際にソケットから受信しているものを確認してください。

  2. InputBufferを破損して、同じ接続から同時に別のスレッドを読み取っています。 TIdTCPClient.Connected()への呼び出しでさえ、読み取りを実行します。スレッドを使用している場合は、同時に複数のスレッドで読み込みを実行しないでください。

+0

ありがとう。私はpt 1を試し、それが何らかの洞察を提供して戻ってきているかどうかを見ます。 – Jason

関連する問題