- ベストアンサー
RS-232Cで接続したPC間のファイル転送
環境 [XP VB6.0] お世話になります。 RS-232Cのクロスケーブルで2台のPCを接続し、一方のPCにあるファイルをもう一方のPCに送信し、受信したファイルを保存するというプログラムを作成しないといけません。 現状、フォーム上でコモンダイアログによりファイルを選択し、選択したファイルが、フルパスでテキストボックスに表示されます。 送信ボタンをクリックするとファイルの送信処理を開始し、受信側は受け取ったファイルを保存するという流れを作りたいのです。 しばらく調べたのですが、なかなかクリティカルする回答を見つける事が出来なかったので質問させていただきます。 もうこのような転送手段は使わないと思いますが・・・。 MSCommコントロールを使用し、文字の送受信程度であればできたのですが、MSCommではファイル転送はできないのでしょうか? 送信側、受信側のプログラムをご教授いただければと思います。 つたない文章で申し訳ありません。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>この記述で、バイナリモードで開いたファイルを >あたかもコピーしたかのような形で、別のファイルとして書き込む事が出来ますが、 >このbytBufAll()の内容を転送し、Putステートメントを受信側で行うと言う考え方で >間違いないでしょうか? 微妙にちがう気がします。 Putはファイルへの出力ステートメントですから、「受信側でおこなう」ものではありません。 つまり、Putに相当する全バイト送信関数を「送信側PC」で実装し、 加えて、これを受信してファイルに落とす受信関数を「受信側PC」に 実装する必要があります。 提示されているプログラムではbytBufAllの最大数が指定されていないので プログラム的にもまずいとおもいます。 あえてこれを利用するならLOFでファイルのサイズ分を得て Redimするのが定石かな。 そのあと、よみだされたbytBufAllを1バイトづつMSCommに送出するのを 繰り返せばよいとおもいます。 受信側にそれなりの速度があって、受信バッファももっているようなら 数十バイトづつおくるのもありかとおもいます。 ただ、受信側ではファイルの終端であることが認識できませんから 前述のように、ファイル終端をなんらかの形で伝えられていること が前提ですし、通信途絶などの不慮の状態を検出できるように プログラム構造を考えておくことが必須です。
その他の回答 (2)
- techa
- ベストアンサー率60% (41/68)
まず、RS232Cでもバイナリファイルの転送は可能です。 ただ、考えなければならないことが増えるので、何かしらの方法が 必要とされるだけです。 RS232Cでの転送がキャラクタ転送となるときは、 表示キャラクタ以外の文字を制御文字として扱えるので、 データの終端などを正確に把握することが可能です。 これに対して、バイナリの場合は&h00~&hffまでのすべての コードが出現可能であって、データの区切りの認識ができなく なるからです。 これでは、受信側のPCはいつ伝送終了になったのか、把握するすべ がありませんね。 そこで伝送のプロトコルを定めることになるのですが、それには ANo1さんのように、全部テキスト化しておくるほうほうもわかりやすくて よいとおもいます。ただ、このようにおこなうと 実際のバイト数*(1バイトを表現する文字数)+α の時間がかかってしまいます。 あるいは、先に全体のバイト長をキャラクタでおくっておいて、その後は 一定バイト数をバイナリでおくる、というのも手ですね。 昔からある手法ではXMODEMやYMODEMなどの方法もあります。 しらべてみるのもいいでしょう。 いまどきなら、一旦BASE64でエンコードして全部テキスト化してしまい、 これをそのまま転送し、受信PCで再度デコードするというのもありかも しれません。 VBならこちらのほうがサンプルをみつけやすいようにおもいます。
お礼
techa様 ご返答ありがとうございます。 さらに質問になりますが、 Dim bytBufAll() as byte Open FILENAME1 For Binary As #1 Get #1, , bytBufAll() 'ファイル全体を読み込む Open FILENAME2 For Binary As #2 put #2, , bytBufAll() 'ファイルを書き込む この記述で、バイナリモードで開いたファイルを あたかもコピーしたかのような形で、別のファイルとして書き込む事が出来ますが、このbytBufAll()の内容を転送し、Putステートメントを受信側で行うと言う考え方で間違いないでしょうか?
- Hayashi_Trek
- ベストアンサー率44% (366/818)
MSCommコントロールには直接ファイルを転送する機能はありません。 その機能はあなたが作ることになります。 (それがファイル転送のプロトコルとなります) ファイルを転送するには最低限 1.ファイル名を送る 2.ファイルの中身を送る。 の2段階の処理が必要です。 スマートでは無いけど簡単な方法を示します。(概念だけなのでテスト無し) 送信側 (1)ファイル名をテキストで送る。 (2)ファイルをバイナリモードで開く。 (3)1バイト読み込む。 (4)読み込んだデータをCstr関数で数値文字列にして送る。 (5)ファイルがEOFでなければ(3)に戻る。 (6)-1を送ってファイル終了を知らせる。 (7)ファイルを閉じる。 (8)終わり 受信側 (1)ファイル名を受け取る。 (2)受け取ったファイル名(パス部分は削除)でバイナリファイルを開く。 (3)データを1行受信する。 (4)データが-1なら(7)へいく。 (5)受信したデータをバイト変数に入れて、ファイルへ1バイト書込む。 (6) (3)へ戻る。 (7)ファイルを閉じる。 (8)終わり
お礼
Hayashi_Trek様 早速のご回答ありがとうございます。 ファイルそのものは遅れないんですね・・・。 例えば、ワードデータとかエクセルデータはたまたビットマップデータ等、中身がテキストとは限らないファイル等のやり取りはできないのでしょうか?
お礼
techa様 たびたびありがとうございます。 ひとまず、送信側のPGを作成し、受信側のPGを作成しているところです。 bytBufAll()の内容を受信し、ファイルに書き込んでも文字化等がおこり、うまく開けない状態ではあります。 もう少し試行錯誤してみて、どうしてもうまく行かない場合はまた質問を上げたいと思います。 お力を貸していただき本当にありがとうございました。