- PR -

NetworkStream.Readメソッドについて

1
投稿者投稿内容
きゃる
会議室デビュー日: 2006/04/06
投稿数: 11
投稿日時: 2006-09-07 17:48
まだまだVB初心者のため、有識者の方ご教授ください。

現在、ネットワークの上り下りの部分のロジックを作成しています。
問題は下りの受信部分ですが、現在は単純に
ns.Read(buffer,0,buffer.length)
という1ステップのみのコードになっています。
そこで出てしまったのが、下り電文を全て受信できず、
中途半端なデータしか受信しないままReadが終了するという事象です。

ヘルプを参照してもいまいち良く理解できないのですが、
三つ目のパラメータのsizeに受信予定のサイズを渡してあげればこのReadメソッドは、
「sizeのデータを受信するまで終了しない」or「タイムアウトでIOException発生」
の2択になるという認識で良いでしょうか?

今回bufferの先頭に下り電文のサイズが入っているので、
ns.Read(buffer,0,buffer(0))
とすべきでしょうか?

それともDataAvailableプロパティを無限ループでチェックし、falseが返ってきたら抜けるというロジックにすべきでしょうか?

簡単にいうと、下り電文のデータを確実に全て受信したいだけなのですが・・

以上、よろしくお願い致します。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-09-07 17:58
Read メソッドの返値を使って判断すればいいんじゃないですか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-09-07 23:09
 ns って何?NetwrokStream クラスのインスタンスだとして。

> 今回bufferの先頭に下り電文のサイズが入っているので、
> ns.Read(buffer,0,buffer(0))
 嘘おっしゃい。buffer にはまだ何も入っていないでしょ?
 そうではなく、受ける電文の、先頭何バイトかに、全体のバイト数が入っているわけでしょ?実行される順番を、正しく考えましょう。

 言葉遊びのように思えるかもしれませんが、コンピュータの頭は固いので、この辺を正しく伝えてやらないと、思った通りの動作はしません。

 で、このように考えると、全体を受け取る前に、まず全体のバイト数だけを受け取らなければならない、ということがわかるのではないでしょうか。
 普通、こういうものを「ヘッダ」として定義して、ヘッダのバイト数は不変にします。
いや、ヘッダのバイト数が可変のものもあるけど、そういうものでも「不変」な箇所があったり、諦めて1バイトずつ読み取ったりします。

こんな感じかな?
コード:

Dim 受信バッファバイト数バッファ As Byte
ns.Read(受信バッファバイト数バッファ, 0, 1)
Dim 受信バッファバイト数 As Integer = CInt(受信バッファバイト数バッファ)
Dim 受信バッファ(受信バッファバイト数) As Byte
ns.Read(受信バッファ, 0, 受信バッファバイト数 - 1)


"-1" がいるかどうかは、「バイト数」にバイト数の通知のバイト数も含まれるかどうかで決めてください。
# あれ?Integer って 1 バイトだっけ?
# 実行できるコードを書いたつもりはありません。

[ メッセージ編集済み 編集者: Jitta 編集日時 2006-09-07 23:11 ]
1

スキルアップ/キャリアアップ(JOB@IT)