ブロードキャストを使った相手先に特定について教えてください

[戻る]
cho0 2006/05/11(木) 11:41:56
はじめまして、どうしてもわからないのでよいアドバイスをお願いします。
 ただいま、IPメッセンジャーを作ろうとしています。UDPのブロードキャストを使っ
て、相手先のマシンが動いているかを判断したいのですが、方法がわかりません。
何か参考のできるサイトはありますか?

環境は、windowsXP,言語はVC++.net, MFCは使用していません。

んー 2006/05/11(木) 11:54:07
相手に受け取ったら返事を投げ返してもらって
一定時間内に一度も応答がなければ動いていないと判断するとか

cho0 2006/05/11(木) 12:08:07
返答ありがとうございます。
相手に受け取ったら返事投げ返してもらうということなんですが、
具体的にプログラムソースとして、どんなことをすればよろしいのでしょうか?

なにぶん勉強不足で、申し訳ありません。
よろしくお願いします。

REE 2006/05/11(木) 12:22:48
具体的にプログラムソースを書く前に
具体的な仕様をきめましょう。

cho0 2006/05/11(木) 13:05:24
 IPメッセンジャーを使って相手にメッセージを送るために、相手のマシンが動いてい
たら、相手のIPアドレスとホスト名を表示させるようにしたい。動いていなければ、表
示しないようにしたいです。

Ban 2006/05/11(木) 13:37:29
> 表示しないようにしたいです。

「したいです」というのは、要求ですね。
それを元に「どのようにするか」が仕様、そして仕様を決めるのが設計。
これがプログラマ(SEとか別のなで呼ぶ人もいますが)のするべき作業であり、
cho0 さんの後でのお楽しみです。
ソースうんぬんは、少なくともどうやるか(仕様)が決まった後の話です。

詳しい人に実現の可否とかもろもろ相談するのはいいことですが、
設計もせずにいきなりソースの書き方を聞いてしまうのでは設計を放棄していますし、
勉強不足は解消されません。

cho0 2006/05/11(木) 13:53:10
表示させるために、UDPのブロードキャストを使い、相手にバケットが届いたら相手のIP
アドレスとホスト名を返してもらい、それを送った方にそのホスト名を表示させる。
相手にパケットが届かなかったら、送った方にはなにも表示されない。

kure 2006/05/11(木) 13:58:32
ちょっとだけ。

> ソースうんぬんは、少なくともどうやるか(仕様)が決まった後の話です。

仕様を決める前(設計をする前)に技術調査ってフェイズがあったりもします。
時間がないと大抵は設計と一緒になっちゃうんですけどね^^;

cho0さんの場合は、
技術調査と設計をすっ飛ばして実装だけしか考えてないって状況です。
まずはUDP/IPの特性を理解するというあたりから手をつけたほうが自身のためになりま
す。

その上で実装で判らないことがあれば相談してみてください。

Blue 2006/05/11(木) 14:00:08
> 送った方にはなにも表示されない。
表示非表示とおっしゃっていますが、それはどの画面に対してでしょうか?

> UDPのブロードキャストを使い
を行うタイミングは?

REE 2006/05/11(木) 14:06:01
方針が決まったのでしたら、
実装するのに必要な具体的な仕様をきめましょう。

決める内容の例:ポート番号、パケットのフォーマット、etc.

cho0 2006/05/11(木) 14:07:47
IPメッセンジャーを立ち上げたとき(最初の画面)に、相手先のパソコンが同じものを
立ち上げているかどうかです。 立ち上げていなければ非表示、立ち上げていれば、相
手のホスト名を表示させる。

UDPを使うタイミングは、IPメッセンジャーを立ち上げたときです。

kure 2006/05/11(木) 15:03:47
やりたいことをもっと細分化して詳細を決定していきましょう。

例えば

>IPメッセンジャーを立ち上げたとき(最初の画面)に、相手先のパソコンが同じものを
>立ち上げているかどうかです。 立ち上げていなければ非表示、立ち上げていれば、相
>手のホスト名を表示させる。

これは以下のようになります。

1)IPメッセンジャーを立ち上げる。
2)UDPブロードキャストで相手の状態を調べる
3)2)の結果、ホスト名を画面に表示

さらに細分化すると

1) IPメッセンジャーを立ち上げる。
 1-1) メインWindowの作成
 1-2) 必要なコントロールの作成と配置
2) UDPブロードキャストで相手の状態を調べる
 2-1) UDPソケットの作成(WindowsであればWinSockの初期化を含む)
 2-2) ブロードキャストに必要なデータを作る
 2-3) 定められたシーケンスで相互通信を行う
3) 2)の結果を画面に表示
 3-1) 2)の結果を保持しているデータを読み込む
 3-2) フォーマットしてホスト名を画面に出力

といった感じになります。

こんな感じでどんどん細分化して設計を行っていきましょう。
そうしていけば自ずとREEさんのおっしゃっている

> 決める内容の例:ポート番号、パケットのフォーマット、etc.

といった事柄も決めなければならなくなっていきます。

通りすがり 2006/05/11(木) 16:00:51
特定の相手が生きてるかじゃなくて不特定多数のクライアントの生存確認なら

↓こんなのとか
各々が定期的にブロードキャストで生存通知パケットを投げて、
それを受け取ったクライアント側は通知の来たマシンを一覧として列挙してリスト表示す
る。
一定時間以上生存通知パケットが来ないクライアントは終了されたとみなしてリストから
削除する。

クライアント数が増えたら大変だろうけど…

cho0 2006/05/11(木) 19:22:37
2) UDPブロードキャストで相手の状態を調べる
 2-1) UDPソケットの作成(WindowsであればWinSockの初期化を含む)
 2-2) ブロードキャストに必要なデータを作る
 2-3) 定められたシーケンスで相互通信を行う

3) 2)の結果を画面に表示
 3-1) 2)の結果を保持しているデータを読み込む
 3-2) フォーマットしてホスト名を画面に出力
 3-3) ホスト名をリストボックスの中にいれる
4) 相手に送信する
 4−1 3)のあて先を選ぶ
 4−2 メッセージを入力する
 4−2−1 エディタボックスに書き込む
 4−3 TCP/IPを利用して、相手にメッセージを送る

4に関してはほとんどできています。
 

yuu 2006/05/12(金) 09:31:22
[[解決]]
なんとか解決できました。どうもありがとうございました。

kure 2006/05/12(金) 09:58:27
yuuさんはcho0さんとは別人ですよね??

2-2)や2-3)をもっと具体的にしていきましょう。
ブロードキャストに必要なデータとは何か、
定められたシーケンスとは何かといったことを
整合がとれるように組み立て詳細を決定していってください。

具体的な手順は
通りすがりさんやんーさんの発言を参考にしてみてください。

cho0 2006/05/12(金) 18:37:54
設計がようやくできました。
必要な部分だけ抜粋しておきます。その上で質問させていただきたいと思います。
 ブロードキャストを行うためにすること
1.LAN内なのでメールスロットを使う
1−1 メールスロットの設定をローカルからブロードキャストの設定に変更
1−1−1 \\.\mailslot\path名(ローカル)→\\*\\mailslot\path名(ブロード)
2.受信側での処理
2−1 メッセージが来たことを自動的に取得
3.送り返す
3−1 1.を流用
4.送信画面に表示
4−1.返信された相手のホスト名を取得
4−2.取得したホスト名をリストボックスの中に格納

こんな感じになりました。
ここでわからないのは、
1)1−1−1で、ローカルからブロードに代えてもメッセージが届かない
2)2−1の自動取得の方法

cho1 2006/05/12(金) 20:39:43
誰かが勝手に終了したので、名前を変えます。cho0からcho1にします

kure 2006/05/12(金) 21:48:18
*つきのMailSlotでは一度に424バイトを超えるデータを書き込めません。
この辺が影響していないか確認してください。
メールスロットを開いて非同期でReadFileを行い、
メッセージ受信時にイベントをシグナルにしてやればよさそうな気がします。
試してないのでなんともいえませんが。。。

cho1 2006/05/13(土) 18:57:45
@非同期でReadFileを行う
Aメッセージ受信時にイベントをシグナルする

こんな感じでしょうか?
@. 1-1) WSAAsynSelect関数を使って、非同期モードにする
  1-1-1) このとき、lEventにて、FD_READを設定

A. 手順がわかりません。  

kure 2006/05/13(土) 19:57:41
> @. 1-1) WSAAsynSelect関数を使って、非同期モードにする
>   1-1-1) このとき、lEventにて、FD_READを設定

ReadFileするといっているのはMailSlotについてでソケットについてではありません。
非同期でReadFileするには最後の引数にOVERLAPPED構造体のポインタを渡すことで
非同期読み取りが行えます。
詳しくはMSDNを見てください。
非同期読み取りにはイベントを使うことができますのでAのやりかたは
非同期ReadFileのやり方がわかれば一緒にわかると思います。

yuu 2006/05/15(月) 15:18:34
MSDNをみても、理解ができないので、アドバイスをください。
bErr = ReadFile(//メール受信チェック
hMailslot,
szBuff,
sizeof(szBuff)-1,
&dwReaded,
NULL);←ここをOVERLAPPED構造体に変更すればよいのですか?

kure 2006/05/15(月) 16:05:12
yuuさんのスレは↓ですよ。

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200605/06050028.txt

別の方のスレに混じって質問されると混同してしまいますので
新規にスレを立てて投稿したほうが良いです。

また、cho0さんのスレを勝手に閉じたことに対して
一言くらい弁解があっても良いと思うのですがいかがでしょうか?

> MSDNをみても、理解ができないので

何が理解できないのですか?
それを説明しないと適切なアドバイスもくそもありません。

具体的な使い方はGoogleで「ReadFile OVERLAPPED」や「ReadFile OVERLAPPED 
CreateEvent」で検索してみてください。

cho1 2006/05/15(月) 16:15:37
kureさん、いろいろとありがとうございます。

cho1 2006/05/16(火) 10:30:37
[[解決]]
みなさん、無事解決いたしました。
いろいろとありがとうございました。

古いスレッドには追加発言できません。