1

古いDOSCNCプログラムをリバースエンジニアリングしようとしていますが、成功は限られています。DOSプログラムからRx/Txストリームをスニッフィングし、これを見ました...

DOSからの送信:

"OUTPUT TEST" 0D 

マシンからの受信:

"OUTPUT TEST" 0D 0D 0A 
0D 0A 
"TEST" 0D 0A 
"0001>  +09000  +09000  +00000  +00000  +00000  +00032  +00000  D  O  " 0D 0A 
"0002>  +00000  +03000  +00000  +00000  +00000  +00032  +00000  B  N  " 0D 0A 
"0003>  +00000  +03000  +00000  +00000  +00000  +00032  +00000  B  N  " 0D 0A 
"0004>  +00000  +03000  +00000  +00000  +00000  +00032  +00000  B  N  " 0D 0A 
"0005>  +00000  +03000  +00000  +00000  +00000  +00033  +00000  B  N  " 0D 0A 
"0006>  +00000  +03000  +00000  +00000  +00000  +00033  +00000  B  N  " 0D 0A 
"0007>  +00000  +03000  +00000  +00000  +00000  +00033  +00000  B  N  " 0D 0A 
"0008>  +00000  +03000  +00000  +00000  +00000  +00033  +00000  B  N  " 0D 0A 
"0009>  +00000  +03000  +00000  +00000  +00000  +00033  +00000  B  N  " 0D 0A 
"0010>  +09000  +17000  +00000  +00000  +00000  +00064  +00000  B  X  .  " 0D 0A 
14 0D 0A 
"PIN>  " 

もちろん、読みやすいようにストリームを再フォーマットする必要がありました。

ご覧のとおり、最後の行には改行がありませ。最後の行は次のリクエストでのみ表示されるため、これによりReadLineは役に立たなくなります。コマンドを送信して最後まで読むことができる必要があります。私がこれを達成することができた唯一の方法は、送信がマシン上で完了するのに十分な時間スリープしてから、PC上でデータを処理することです。一部のマシンでは、遅延を5秒まで高く設定する必要があります。私はそれをこのようにするのは嫌ですが、それは機能します。

While spUISC.BytesToRead > 0
    buffer &= spUISC.ReadExisting
    Threading.Thread.Sleep(100)
End While

概要

終了文字がない場合、着信ストリームが完了したかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

1

私は個人的に次のようにループを変更します。

  1. 使用可能なバイトをバッファに読み込みます
  2. バッファに有効な応答があることを検証してみてください
  3. #2で「はい」の場合、バッファーを消費してループを終了します。それ以外の場合は、さらにデータを待ち続けます。

ブロッキング読み取りを実行できる場合は、スリープする必要はまったくありません。有効なフレームを取得するまで、ループを続けます。明らかに、他のエラー処理が必要になる場合があります。

于 2012-12-12T04:24:48.233 に答える
-1

ブロッキング読み取りを実行しますが、行ではなく文字で処理する必要があります。

「0D0APIN>」はプロンプトのように見えます(プロセス入力?)。行末まで読まないでください。そのプロンプトが表示されるまで読んで(正規表現で認識して)、プロンプトの前のバイトを処理してください。送信したコマンド文字をエコーし​​ているように見えるので、チェックした後、それらの文字を破棄して、クリーンな応答を残します。

リバースエンジニアリングを行うには、テストボックスをターミナルプログラムに接続し、そのプロンプトへのコマンドを手動で試します。コマンドは、0D、0A、またはその両方で終了する場合があります。例:空白のコマンド「HELP」、「?」または、無効なコマンドが有用な情報を提供する可能性があります。

于 2012-12-12T05:45:09.103 に答える