- PR -

[VB.NET]ソケット通信(BeginReceive)について教えて下さい。

1
投稿者投稿内容
たけちほ
会議室デビュー日: 2004/03/31
投稿数: 7
お住まい・勤務地: 千葉県
投稿日時: 2004-03-31 13:52
はじめまして。たけちほと申します。

現在、VB.NETにてソケット通信のプログラムを作成しています。
概要は
  ・サーバー、クライアントは1対1
  ・サーバー側はListen状態で待ち受け、クライアント側からConnect要求を発行し接続
  ・接続されたら切断処理を実行するまで接続したまま
  ・サーバー、クライアント共に接続状態になったらBeginReceiveメソッドを実行し、
   メッセージを待ち受ける
  ・サーバー、クライアント共にメッセージを受信したら、BeginReceiveメソッドで
   指定したコールバックメソッド内で、画面に受信したメッセージを表示
というような流れになっています。

メッセージの送信がある程度の時間を空けて実行される分には問題なく動作しているのですが、
送信の間隔が200ミリ秒以下になってくると、複数の電文がくっついて受信されてしまいます。

送信された単位で受信する事はできるのでしょうか?
よろしくご教授願います。

ちなみに、電文の中には電文長も含めているので、それを参照しながら受信した電文を
分解する方法はありますが、できれば送信した単位での受信ができるようにしたいのです。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2004-03-31 14:14
> メッセージの送信がある程度の時間を空けて実行される分には問題なく動作しているのですが、
> 送信の間隔が200ミリ秒以下になってくると、複数の電文がくっついて受信されてしまいます。

それが正しい動作です。TCPでは送信した順番どおりに到着すること以外は保障しません。2回に分けてSendDataに渡しても一度に届きます。(SendDataの呼び出し間隔が短い場合、通信料を削減するために、一つのフレームに納めて送信するように努力します。)また1回でSendDataに渡しても複数回に分けて届く場合もあります。(1つのフレームに収まらない場合、自動的に複数のフレームに分解して送ります。)

2回のSendData呼び出しが、2回のReceveDataになって欲しいなら、UDP使ってください。TCP使うなら電文長をみて分解するしかありません。
たけちほ
会議室デビュー日: 2004/03/31
投稿数: 7
お住まい・勤務地: 千葉県
投稿日時: 2004-03-31 14:53
甕星さん。

こんな初歩中の初歩の質問に回答いただきありがとうございました。
そうですよねぇ。そうなりますよね。
電文長で分解するように変更します。

ありがとうございました。
1

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