tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルGetDataとPeekData
記事No11890
投稿日: 2008/03/26(Wed) 11:32
投稿者コーヒーブレイク
いつも大変お世話になっています。

現在VB6_SP6にてサーバークライアントのアプリケーションを作成して
いるのですが、以下のことで悩んでいます。

<1>現在ソケット通信の受信処理は以下の手順で行っています。
 ・DataArrivalイベント内にてPublic変数に追加(データは全てString型です)
 ・Connect状態の時のみ起動させてあるタイマーイベント内にて上記
  Public変数から順次受信処理を行う。

<2>上記の処理を以下のように変更しようと考えています。
 ・DataArrivalイベント内にてPeekDataを利用し1受信分受信が完了したことを
  確認し、その分だけGetDataにて取得し受信処理を行う。
  1受信処理を行ったらDataArrivalイベントを抜ける。

ここでヘルプの「GetData メソッド (WinSock コントロール)」を参照したところ
解説の欄に、
「通常は、DataArrival イベント内で、その引数 bytesTotal を指定して
GetData メソッドを呼び出します。引数 maxlen に bytesTotal より小さい値を
指定すると、残りのデータが失われることを知らせる 10040 番の警告が発生します。」
と記載されています。

ということは<2>の処理に変更すると取りこぼしが発生してしまうのでしょうか?
勘違いしている、あるいは前提条件がある、またはもっといい作り方がある等
アドバイスいただけると助かります。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: GetDataとPeekData
記事No11902
投稿日: 2008/03/26(Wed) 16:40
投稿者K.J.K.
とりあえず来たデータを全て受け取っておく、というのならば、

> ということは<2>の処理に変更すると取りこぼしが発生してしまうのでしょうか?

ということはあまりないと思われます。PeekDataとGetDataの呼び出しの間にDoEvents
などがあれば別ですが。そうではなく、こちらの想定する1受信分だけをきっかりとる
というのならば、取りこぼしが生じる可能性はあります。

> 勘違いしている、あるいは前提条件がある、またはもっといい作り方がある等
> アドバイスいただけると助かります。

時間がかかる処理ならばTimerイベントプロシージャ中のが良いかも知れませんし、
そうでないのならば、DataArrivalイベントプロシージャ中で処理のが良いでしょう。

前者ならば、<1>の通りでしょう。但しPublic変数というよりはモジュールレベルの
変数にすべきでしょう。
後者ならば、<1>と<2>を組み合わせて、
<2改>
 ・モジュールレベルの変数を用意する。
  DataArrivalイベント内にてGetDataで取得しその変数に連結して格納する。
  その中で1受信分のデータの有無を調べて、もしあれば切り出して
  該当する処理をして、使った分のデータを捨てる。
  DataArrivalイベントを抜ける。
とでもするのが良いかもしれません。

[ツリー表示へ]
タイトルRe^2: GetDataとPeekData
記事No11907
投稿日: 2008/03/27(Thu) 09:01
投稿者コーヒーブレイク
K.J.K.さん、回答ありがとうございます。
昨日は打ち合わせ続きで書込が翌日になってしまって申し訳ありません。

必要な部分のみ下に抜粋させていただきます。
> こちらの想定する1受信分だけをきっかりとる
> というのならば、取りこぼしが生じる可能性はあります。

> 時間がかかる処理ならばTimerイベントプロシージャ中のが良いかも知れませんし、

> 前者ならば、<1>の通りでしょう。但しPublic変数というよりはモジュールレベルの
> 変数にすべきでしょう。

1受信分の処理で一度完結したいことと処理的に短い処理ではないことを考えると
今のままが良いようですね。
Public変数からの変更を検討したいと思います。

何となくは理解していたのですが、自信がなかったので丁寧なアドバイス
をいただけてほんとうに助かりました。
ありがとうございました。

[ツリー表示へ]