Winsockを使ったUDPについて

解決


セロ  2007-09-12 02:07:16  No: 137417

こんにちは、TCP/IP通信の初心者です。
VB6 + Winsockコントロールの組み合わせです。

アプリAのタイマー内にて、一方的にデータを送信し、アプリB(複数PCで動作)から、それを受信する方法は簡単にできますでしょうか?

また、アプリAでは、アプリBが起動していない時には送信しないという方法もできますでしょうか?

可能でしたら、簡単なやり方を教えていただけたら幸いです。
UDPが簡単そうではありますが・・・


セロ  2007-09-12 02:09:16  No: 137418

↑の質問ですが、補足です。

アプリAにて使用するWinsockコントロールは1つが理想です。
また、アプリAではアプリBのIPアドレスやポート番号は不明です。


ガッ  2007-09-12 17:58:00  No: 137419

> アプリAのタイマー内にて、一方的にデータを送信し、アプリB(複数PCで動作)から、それを受信する方法は簡単にできますでしょうか?
> また、アプリAではアプリBのIPアドレスやポート番号は不明です。
とりあえず受信側のポート番号くらいは,送信側でなんとか解決しないといけません
で,どんなIPアドレスに送信すればいいのかは,
まあ最悪ネットワークブロードキャストでもいい"かも"しれません
状況が不明ですので深くいえないです

> アプリAにて使用するWinsockコントロールは1つが理想です。
送信側はWinsockコントロール1つで十分でしょう

> アプリAでは、アプリBが起動していない時には送信しないという方法もできますでしょうか?
現実的に考えてください
アプリBが「どこに,どれだけいるのか」わからない状況で起動しているかどうかは判断できないでしょう
となるとアプリBがいろいろな手段で「ここに,私がいるかも」という情報をアプリAに伝える必要があります
ここは工夫のしどころですので,分散ハッシュテーブルなどP2Pの技術を参考にすればよろしいかと

※外してる悪寒


我龍院  2007-09-12 18:33:32  No: 137420

UDPが簡単そうだからUDPを使うとしたら、やめた方がいいですね。
UDPはデーターの取りこぼしなんかがあります。
あとは普通のサーバー&クライアントのプログラムとなります。
アプリAがサーバーとすると、サーバー側はポートを開けて、接続要求を
待ち、クライアントから接続要求があれば、新しいWinSockをロードして、
Acceptを返します。
サーバー側はクライアントのIPアドレスを知る必要は有りません。
サーバー側のタイマーで、現在接続しているクライアントにデーターを
送ります。
クライアントが切断して来たら、Closeイベントが発生するので、
発生したWinSockをUnLoadします。
面倒なのは、サーバー側のクライアントの接続要求が有った時に、新しい
WinSockを作って接続を確立し、切断があった場合にそのWinSockをUnLoadする
部分ですが、WinSockの配列で管理すればそれほど複雑にはなりません。
WinSockはクライアントの数+1(接続受け付け用)となります。


セロ  2007-09-12 18:39:28  No: 137421

>ガッ さん
ご回答ありがとうございます。
何がしたいかを述べておりませんでした。すみません。

よく、データロガーなどの装置で、不特定多数の端末にてデータを収集できるものがありますけど、そんなアプリAでは、まさにそんなのをやりたいんです。

【送信側】
時局のIPアドレスと、ポートNOを指定

【受信側】
送信側のIPアドレスとポートNOを指定

こんなイメージで、送信側はデータを送信するのみ、受信側は届いたデータを受信するのみといった感じにしたいのですが・・・

RS-232Cなど、シリアル通信で、送信側は一方的に垂れ流し、受信側はそれを拾うだけ!のようなイメージです。

「アプリAでは、アプリBが起動していない時には送信しない」ってのも表現が悪かったです。
厳密に言えば、「アプリA側で、送信先となる端末が接続されていない場合は、送信処理が無駄なため、なるべく送信をせずに待機しておきたい」です。
全く意味合いが違いまして、もうしわけありません。

今、送信側(アプリA)を色々調べながらやってるのですが、Winsockコントロールの初期設定(Form_Load内のコード)でいきなりこけちゃってまして(..;)


ささき  2007-09-12 18:39:56  No: 137422

>> アプリAでは、アプリBが起動していない時には送信しないという方法もできますでしょうか?

私がやった手法では、
アプリBがプログラミング内で論理IPアドレスを振っており、
起動時にそのIPへのリンクがあがらないと、送信しない(=できない)。
という判断をしていますが、
ガッさんの言うとおりここは工夫のしどころかと思います。


セロ  2007-09-12 18:45:56  No: 137423

>我龍院さん
ご回答ありがとうございます。
↑のコメント書いている間に投稿いただけた模様です。

ご指摘の通り、UDPにはそんな問題があるようですね。
その辺も踏まえまして、色々試してみます。
何か良いサンプルがネット上にあれば、教えてもらえますでしょうか?

色々、用途に合ったものを探してみてはいるんですが、なかなか「まさにこんな感じだ!」というのがみつからなくて・・・

申しわけございません。


セロ  2007-09-12 18:55:51  No: 137424

>ささきさん
ご回答ありがとうございます。
書き込みのタイミングがラップしてしまいまして、申しわけありません。

アドバイスいただいた部分はあくまでも、出来ればそうすれば良いと思っております。
恥ずかしながら、初期設定の部分でつまずいている状況なので、まだその局面にきておりませんが・・・
『アプリBがプログラミング内で論理IPアドレスを振っており』
のお言葉ですが、論理IPアドレスを振るというのが今一です。アプリA側のIPアドレスとは違うのでしょうか?
本当にTCP/IP関連のプログラミングについては「ド」の付く素人ですので、私がもっと勉強せねばなりませんね。

申しわけございません。


我龍院  2007-09-12 19:44:32  No: 137425

>>何か良いサンプルがネット上にあれば、教えてもらえますでしょうか?
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnvs05/htm/2005/migrate/Socket.asp
あまり良いサンプルでは有りませんが、ここに基本的な
操作のサンプルがあります。(クライアントからの切断処理が無い)
クライアントの数は固定となっていますが、クライアントが少ない場合は
これでも良いでしょう。
何度も書きますがクライアントのIPアドレス又はホスト名は必要有りません。
サーバー側の(A側)のIPアドレスか又はホスト名とポート番号が判ればOKです。


セロ  2007-09-12 20:52:59  No: 137426

>我龍院さん
どうもありがとうございます。
アドバイスいただきました通り、現在、TCPサバクラ方式により、ガチャガチャと試みております。
クライアント数は少ないので、定数分のWinsockをあらかじめ準備しておくというやり方で問題なさそうです。
一応、形には出来そうな感じになっておりますが、エラー処理など、細かな所も含めて、教えていただきましたサンプルの内容も参考に、やってみようと思います。

その他の皆様も色々なアドバイスありがとうございました。


セロ  2007-09-12 20:54:18  No: 137427

すみません。解決付けるの忘れておりました。
また機会があれば(あって欲しくないですが^^;)よろしくお願いいたします。


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




  


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