- PR -

ソケット通信時の送信タイムアウト方法

1
投稿者投稿内容
Gordon
常連さん
会議室デビュー日: 2004/02/18
投稿数: 34
投稿日時: 2005-06-23 15:35
はじめまして。
現在,C#でUDPプロトコルを使った通信ツールを作っています。
使用クラスはSocketクラスです。送信メソッドはSendTo()です。
送信側と受信側にそれぞれこのツールを置いて通信テストをしています。

複数の受信先に一気に連続してデータを送信したいと思います。
この場合,受信先のツールが立ち上がっている場合は全てスムーズに送信できますが,
複数の受信先で1つでもツールが立ち上がっていない,もしくは受信側の端末が起動
していない場合は,10秒ほど待ち時間たってから送信側で例外が発生します。

一気に送信してそれから待ちという風にしたいのですが,いい方法はありますでしょうか?
SetSocketOption()でSendTimeoutを設定できますが(以下のように),有効になっていないように思えます。

oSocket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
oSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);
oSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.SendTimeout,1);

いい方法をご存知の方,宜しくお願い致します。

甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-06-23 15:54
解決策としては・・
・非同期クライアント ソケットを使う。
・送信を複数スレッドに分割する。
・ユニキャストを止め、マルチキャストやブロードキャストを活用する。
ぐらいかなぁ。

#でも何で10秒も待っているんだろう。
#ICMP destination unreachableを待っているのだろうか?
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
Gordon
常連さん
会議室デビュー日: 2004/02/18
投稿数: 34
投稿日時: 2005-06-23 16:04
お返事ありがとうございます。

・非同期クライアント ソケットを使う。
・送信を複数スレッドに分割する。

上記2つは思いつきませんでした。

・ユニキャストを止め、マルチキャストやブロードキャストを活用する。

マルチキャストはちょっと考えていました(違うセグメント上ではブロードキャストが使えないため,複数IPで送信しようと思っています)。
ただ,使用方法がいまいちつかめなかったので,ちょっとやり方を考えています。
海外サイトでサンプルを見つけることはできたのですが,そのサンプルだと
受信側がマルチキャストアドレスを知っておかないとだめなようなロジックでしたので,
使えないかなと思っています。
マルチキャストの場合はマルチキャストで使えるアドレスを受信側も知っておかないと駄目なのでしょうか?

#でも何で10秒も待っているんだろう。
#ICMP destination unreachableを待っているのだろうか?

すみません,これは私の勘違いでした。
0.8秒弱です。でもこの待ち時間がなければと思っています。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-06-23 17:56
引用:

yu-yuさんの書き込み (2005-06-23 16:04) より:
マルチキャストの場合はマルチキャストで使えるアドレスを受信側も知っておかないと駄目なのでしょうか?


その通りです。クライアントや経路上のルーターが、使用するマルチキャストアドレスを知っていないと利用できません。インターネット上では事実上使えませんが、社内WAN等では通信量を減らす為に活用できるでしょう。
1

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