WinSockのDataArrivalイベントを1回だけ発生させるには


あみ  2003-08-08 02:37:37  No: 78932

VBで、WinSockコントロールを使ってPC間のTCP/IP通信をしているのですが
相手から大きいサイズ(18000KBなど)のデータが1回送信された場合
こちらでDataArrivalイベントが何度も発生してしまい、困っています。

相手からの1回の送信につき、1回だけDataArrivalイベントを発生させる方法はありますでしょうか?

もしそれが無理だった場合、自分で複数の受信データを結合させようと思っているのですが、その際、どこからどこまでが1回分のひとまとまりのデータなのかを判定する方法がありますでしょうか?

もし分かる方がいましたら教えてください。
よろしくお願いいたします。


あみ  2003-08-08 07:02:43  No: 78933

一応方法を考えました。(下記)
こういうやり方は一般的でしょうか。
もしこういう方法でやったことがある方、他にいい方法のある方がいましたら教えてください。

①相手からの受信データの始まりにデータサイズが入ってくるのでデータサイズをPeekData()で取り出す。
②何度受信イベントが発生してもBytesReceivedプロパティがそのデータサイズ以上とならないうちは何もしない。データサイズ以上になったらGetData()を行い、受信処理を行う。

今受信したものがデータの始まりだという絶対的なものがないので
下記のようにあやしいときはとりあえずGetData()でバッファをクリアしてしまう。
①タイマ監視して受信イベントが発生してから0.5秒以上受信イベントが発生しない場合GetData()でバッファをクリア
②データに入ってくるはずのデータサイズがありえない数値だったらGetData()でバッファをクリア
③データに入ってくるはずの年月日時分秒をチェックしてありえない数値だったらGetData()でバッファをクリア
④ソケットのErrorイベントが発生したらGetData()でバッファをクリア


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加