WinsockのDataArrivalイベントのについて

解決


コボル  2005-09-27 21:47:05  No: 125748

初めまして。

Winsockコントロールを使用した通信プログラムを作成中に
問題にぶち当たりましたので質問させていただきます。

DataArrivalイベントにてGetDataメソッドを呼び出し、DataArrival
イベントの引数TotalLength分だけDataを取得しています。
Client側から連続送信をした時(例えば3MSG)にサーバー側で取得した
データが2MSGになってしまいました。
ログを取ってMSGの中身を確認したところ、2MSG目と3MSG目がくっ付いて
取得されていた為に計2MSGになっている事がわかりました。
(MSG:1,2,3  が  MSG:1,2+3)
出来れば一回のDataArrivalイベントで1MSGを受信したいのですが、
何か良い方法ってありますでしょうか・・・?(漠然とした質問かも)
1MSGが分割されて届いちゃう事は良くあるけど、SendDataメソッドを
3回呼び出してMSGを送信してるのに、Socket通信中にくっ付いちゃう
なんて・・・TCP/IPの特性??

GetDataメソッドの引数MaxLenで1MSG分取得にすると残りのMSGが失われ
てしまうのでそれは避けたいです。

いろいろ検索したのですが、上記の解決策を見つけることが出来ませんでした。
どなたか同じ現象を経験された方いませんでしょうか。

環境はVB6.0WinXPです。

宜しくお願いします。


030  2005-09-27 22:15:38  No: 125749

その通信仕様でクライアント側は1つのメッセージを送信したあと
〜秒以上の間隔をあけて次のメッセージを送信しなければならない
とされているならクライアント側の通信手順違反になるでしょうけど
そうなっていないなら、複数のメッセージを続けて送信しても
良いはずです。
それを処理できないサーバー側の問題です。

で、案としてはモジュールレベルのグローバル変数に受信した
メッセージをどんどん放り込んで、その中で処理をした分だけ
バッファから取り去っていくというような方法でできるんじゃ
ないでしょうか。

(1)データ受信(例えばMSG1,MSG2,MSG3の途中まで受信)
    ↓
(2)受信バッファに受信したデータを追加
    ↓
(3)受信バッファを調べ最初のメッセージを取り出す
    ↓
(4)メッセージが無いOr受信が完了していない場合は処理を抜ける
    ↓
(5)メッセージに対する処理を行い、受信バッファより処理したメッセージを削除する
    ↓
(6)(3)へ戻る

といった感じでしょうか。


コボル  2005-09-27 23:23:19  No: 125750

や、やっぱり・・・
>その通信仕様でクライアント側は1つのメッセージを送信したあと
>〜秒以上の間隔をあけて次のメッセージを送信しなければならない
>とされているならクライアント側の通信手順違反になるでしょうけど
>そうなっていないなら、複数のメッセージを続けて送信しても
>良いはずです。
>それを処理できないサーバー側の問題です。

データが繋がっちゃう事あるんですね。知りませんでした。
ネットワークの事まで考えないといけないとは・・・
送信側でIntervalをおくか、サーバー側で作りこむか。
確実なのはサーバー側の対応ですね。

030さんの案を参考にしてやってみたいと思います。
解決です。有難う御座いました。


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

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






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