相手が起動しているか?

解決


初心者NO999  2003-05-01 01:49:24  No: 3467

勉強のためにIPメッセンジャーと同じことをDelphiで
やって見たいと思っております。
NMStrm/NMStrmServ/NMUDPで出来そうな感じなのですが
(サンプルを見ての感想)同じアプリを他のPCで起動
しているかしていないかはどのように判断すればいいのでしょうか?
IPメッセンジャーって起動したときに、他のPCで起動している
人をリストに追加してますが、どうやっているのでしょう?
C言語がわからないため、IPメッセンジャーのソースみても??
でした。
どなたかアドバイスをお願いします。

環境 Delphi5J Pro  Win2000


にしの  2003-05-01 02:07:08  No: 3468

IPメッセンジャーを使ったことがないので想像ですが。
単純に、接続できなかったら相手は起動していない、とみるだけだと思います。
相手のIPがわかっているという仮定で、そのIPの特定ポートに接続を試みます。相手が起動していれば、その接続要求に対して何らかのアクションがあるはずなので、ない場合は起動していないとして処理します。

タイムアウト値を適当な大きさにしておく必要があります。


初心者NO999  2003-05-01 02:37:13  No: 3469

早速の返事ありがとうございます。
>単純に、接続できなかったら相手は起動していない、とみるだけだと思います。
IPメッセンジャーって起動と同時に接続している人をリストに
追加していくんです。
もし接続できなかったら、、、であれば、自IPと同じグループに
接続を試みようとしているってことになりますね。
ということは、自分のIPが10.10.10.1だとしたら255回チェックしているって
ことか。。。。
IPメッセンジャー使ったことないから判らないですね(^^;

でもUPDは接続できても出来なくてもアクションは何もないのではないですか?


にしの  2003-05-01 03:45:28  No: 3470

なるほど、UDPブロードキャストを利用しているようですね。

NMUDPコンポーネントの内容をよく知らないのですが、broadcastに関するプロパティやメソッドはありませんか?

google.comで検索したところ、
http://fundementals.sourceforge.net/cSocketsUDP.html
このようなところが見つかりました。
NMUDPとは無関係のUDPコンポーネントのようですが、参考になるかと思います。


初心者NO999  2003-05-01 05:32:42  No: 3471

broadcastに関するプロパティ・メッソドはないようです。
>google.comで検索したところ、
>http://fundementals.sourceforge.net/cSocketsUDP.html
英語ですか!
英語わからないんですよね。。
何とか調べて見ます。

個人的には、全て自力で作りたいって思ってるんですよね、、
ほかにも情報ってないんでしょうか?


にしの  2003-05-01 06:25:00  No: 3472

Indyならば、Broadcastに対応しているようです。
NMUDPではだめみたいですね。
日本語での情報としては、Delphi-MLの過去ログに少しありました。
ただ、実際のコーディング方法などはないようです。
Delphi-MLの過去ログ検索は
http://www2.big.or.jp/~osamu/Delphi/
こちらから。

もし、Indyでやるのであれば、やり方はたぶん簡単。
TIdUDPClientと、TIdUDPServerを貼り付け、

Client.BroadcastEnabled := True;
Client.Host := '255.255.255.255';
Client.Send('TEST');

とすれば、Server側のOnUDPReadイベントがあがるはずです。
今PCが1台のみなので、きちんと複数のIPに飛ぶかは未確認です。

Indyは
http://www.indyproject.org/
からダウンロードできます。


初心者NO999  2003-05-02 07:24:47  No: 3473

Indyを早速DLしてみました。
イロイロと使えそうなコンポーネントがいっぱいですが、
私にはチンプンカンプンです。
日本語のIndyに関連する(HELPみたいなもの)サイトは
ご存知ありませんか?
調べてるんですが、なかなか見つかりません。


にしの  2003-05-02 07:50:11  No: 3474

http://onigiri.s3.xrea.com:8080/delphi/
ここが整備されれば、Indyの和訳も載るかもしれません。
ただ待つよりも、Indyのdemoをみた方が早いですよ。
デモは、Indyのサイトにあります。
あとは、調べながら(自力で和訳しながら)ですかね。

Delphi-MLなどで質問するのも手です。知っている人がいれば、きっと答えてくれるでしょう。


初心者NO999  2003-05-03 22:17:54  No: 3475

ありがとうございました。
Indyのコードと辞書片手に頑張って見ます。


aiko  2003-05-06 21:30:44  No: 3476

解決してるみたいですけど

TCP/IP通信をよく理解していないように思えます。

> ということは、自分のIPが10.10.10.1だとしたら255回チェックしているって
ことか。。。。
アプリケーションが接続しているPCを探しに行くわけではありません。

アプリがIPメッセンジャーサーバ(?)に接続するのです。
簡単に言うと、相手先のHPを開くってことです。
開いたHP先のサーバでは、接続しているIPはわかっていることは知っていますよね?

そのサーバからクライアント(自分のPC)に今接続しているPCの情報をもらえば、
接続しているPCが判断できるはずです。

ということは、サーバとクライアント2つ作るということです。

> 今PCが1台のみなので、きちんと複数のIPに飛ぶかは未確認です。
1台のPCでサーバ、クライアントのソフトを起動して
IPを'localhost'または、自分のIPを指定すれば確認することが出来ます。
ちゃんと通信も出来ます。

Indyコンポーネントの英語が読めないというのなら
delphi標準のServerSocket,ClientSocketを使った方がいいと思いますよ
日本語のヘルプですし。。。

乱文失礼します。


にしの  2003-05-07 01:41:55  No: 3477

自分が10.10.10.1のとき、10.10.10.*の範囲で不特定の相手を探したいということです。
だから約255回(10.10.10.0,10.10.10.2,10.10.10.3 ...)調べると思ったのでしょう。
TServerSocket, TClientSocketはTCP/IPプロトコルなので、ブロードキャストは使用できません。


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

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






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