いつも参考にさせてもらっています。
現在、LAN内にある起動しているPCをリストに表示するソフトを作成しています。
内容は、ホスト名,IPアドレス,グループ名なのですが、私の方法としてはメッセージをブロードキャストして、そのメッセージを受信したら自PCの情報を返すような仕組みにしたいとおもっています。
自PCのIPアドレス、ホスト名の取得はできるのですが・・。
過去ログを見ても途中で内容が終わっていたり、レスがないものだけで、プログラムの記述の仕方がわかりませんでした。検索しても、よいサンプルがなく困っています。
UDPを利用した、IdudpServer/Clientコンポーネントのプログラムの記述例(ブロードキャストする、また、それの返信)を教えてほしいのですが。
利用する場所は大学の研究室で、環境はWin2kPro + Delphi6 Personal + Indyです。
どうかよろしくお願いします。
オブジェクトインスペクタで以下を設定。
IdUDPServer1.Active := True;
IdUDPServer1.DefaultPort := 12345;
procedure TForm1.Button1Click(Sender: TObject);
begin
IdUDPServer1.Broadcast('おまえら起きとるか?', IdUDPServer1.Binding.Port);
end;
var
OwnReply: Boolean;
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
sMsg, sAddr: string;
SeqID: Integer;
begin
SetLength(sMsg, AData.Size);
AData.Read(sMsg[1], Length(sMsg));
Memo1.Lines.Add(ABinding.PeerIP + ' のPCから "'+ sMsg +' "を受信');
if not OwnReply then begin
OwnReply := True;
IdUDPServer1.Send(ABinding.PeerIP, ABinding.PeerPort, IdUDPServer1.LocalName +' は起きとるで〜');
Memo1.Lines.Add(ABinding.PeerIP +' のPCに "おれは起きとるで〜" を返信');
end;
end;
これだけ?さん レスありがとうございます。
上のソースを真似してかいてみたのですが、コンパイル時に procedure IdUDPServer1UDPReadのところで「未定義の識別子:’TIdSocketHandle’」とエラーが出てしまうのですが、何が原因なのでしょうか?
また、他にも文法ミスのようなエラーが出てしまいます。
コンパイルを通すためにはどうすればよいのでしょうか?よろしくお願いします。
未定義の識別子エラーが出て”何が原因なのでしょうか?”などと
質問するようでは先が思いやられる…かな?
TIdSocketHandleが定義されてるのは、IdSocketHandle.pas
Indyのバージョンが古いのかも。
Delphi7に付属のIndyではTIdSocketHandleは存在しますので。
にしのさん前途多難さん、レスありがとうございます。
そうですか、私のIndyのバージョンが古いのが原因かも知れませんね。
Delphi6 + Indy ではIndyのコンポーネントのUDPでブロードキャストできないのでしょうか?
前途多難?さんのレスの意味は、IdSocketHandle.pasに原因があるということでしょうか?
私の環境では、無理なのですか?
バージョンが変わると仕様もコロコロ変わる素晴らしい特徴を持つIndy。
Indy10では、UDPServerにはBroadcastメソッドもSendメソッドもない。
Indy9なら、UDPServerでBroadcastもSendも出来る。
Indy8のUDPServerでは、どうだったかな?
>Indy10では、UDPServerにはBroadcastメソッドもSendメソッドもない。
Indy10でも、UDPServerの継承元のTIdUDPBaseにBroadcastメソッド、Sendメソッドがあるから使えるね。
>IdSocketHandle.pasに原因があるということでしょうか?
使用Indyバージョンが不明だけど、未定義エラーが出るなら、
uses IdSocketHandle;
Indyと秋の空さん、ン?さんありがとうございます!
>uses IdSocketHandle;
を追加することでコンパイルが通りました。
しかし。。このアプリ、2つ以上は立ち上がりません。ブロードキャストを確認したいのですが、ウチにはPCが一台しかないのですが・・
よい方法を教えてもらえるとうれしいです。
大学の研究室で動作確認できないのかな?
255.255.255.255のIPに送信して自分のPCに届いていれば、一応ブロードキャスト出来ていることになると思うけど…
> if not OwnReply then begin
> OwnReply := True;
> IdUDPServer1.Send(ABinding.PeerIP, ABinding.PeerPort, IdUDPServer1.LocalName +' は起きとるで〜');
> Memo1.Lines.Add(ABinding.PeerIP +' のPCに "おれは起きとるで〜" を返信');
end else begin
OwnReply := False;
> end;
このように変更しないと、最初の1回だけしか返信してくれない。
ちょうど今春休みで、実家に帰省しておりまして(><;
>255.255.255.255のIPに送信して自分のPCに届いていれば、一応ブロードキャスト出来ていることになると思うけど…
の255.255.255.255のブロードキャストアドレス?はどこに記述するべきなんでしょう。理論はわかりますが、Delphiでの記述がわかりません。。
また、自分自身に届いただけでは、皆にブロードキャストできているかはわからないのではないでしょうか?
2つ以上起動させて実験したいのですが・・。
わかる方、よろしくお願いします。
2つ以上の起動はどうやっても無理でしょうか?
ポート番号を変えたり、フォルダを別にして起動させたりしてみましたが、やっぱりだめでした。
どうにかして2つ起動させたいのですが、方法はありませんでしょうか・・
ツイート | ![]() |