IdudpServer/Clientコンポーネントの使い方


アルト  2005-03-23 00:55:32  No: 13888

いつも参考にさせてもらっています。
現在、LAN内にある起動しているPCをリストに表示するソフトを作成しています。
内容は、ホスト名,IPアドレス,グループ名なのですが、私の方法としてはメッセージをブロードキャストして、そのメッセージを受信したら自PCの情報を返すような仕組みにしたいとおもっています。
自PCのIPアドレス、ホスト名の取得はできるのですが・・。

過去ログを見ても途中で内容が終わっていたり、レスがないものだけで、プログラムの記述の仕方がわかりませんでした。検索しても、よいサンプルがなく困っています。
UDPを利用した、IdudpServer/Clientコンポーネントのプログラムの記述例(ブロードキャストする、また、それの返信)を教えてほしいのですが。
利用する場所は大学の研究室で、環境はWin2kPro + Delphi6 Personal + Indyです。

どうかよろしくお願いします。


これだけ?  2005-03-24 11:56:52  No: 13889

オブジェクトインスペクタで以下を設定。
  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;


アルト  2005-03-24 12:42:32  No: 13890

これだけ?さん  レスありがとうございます。

上のソースを真似してかいてみたのですが、コンパイル時に procedure IdUDPServer1UDPReadのところで「未定義の識別子:’TIdSocketHandle’」とエラーが出てしまうのですが、何が原因なのでしょうか?
また、他にも文法ミスのようなエラーが出てしまいます。

コンパイルを通すためにはどうすればよいのでしょうか?よろしくお願いします。


前途多難?  2005-03-25 10:50:58  No: 13891

未定義の識別子エラーが出て”何が原因なのでしょうか?”などと
質問するようでは先が思いやられる…かな?
TIdSocketHandleが定義されてるのは、IdSocketHandle.pas


にしの  2005-03-26 00:09:32  No: 13892

Indyのバージョンが古いのかも。
Delphi7に付属のIndyではTIdSocketHandleは存在しますので。


アルト  2005-03-26 11:25:16  No: 13893

にしのさん前途多難さん、レスありがとうございます。
そうですか、私のIndyのバージョンが古いのが原因かも知れませんね。
Delphi6 + Indy  ではIndyのコンポーネントのUDPでブロードキャストできないのでしょうか?

前途多難?さんのレスの意味は、IdSocketHandle.pasに原因があるということでしょうか?
私の環境では、無理なのですか?


Indyと秋の空  2005-03-26 13:10:08  No: 13894

バージョンが変わると仕様もコロコロ変わる素晴らしい特徴を持つIndy。
Indy10では、UDPServerにはBroadcastメソッドもSendメソッドもない。
Indy9なら、UDPServerでBroadcastもSendも出来る。
Indy8のUDPServerでは、どうだったかな?


ン?  2005-03-26 13:48:03  No: 13895

>Indy10では、UDPServerにはBroadcastメソッドもSendメソッドもない。
Indy10でも、UDPServerの継承元のTIdUDPBaseにBroadcastメソッド、Sendメソッドがあるから使えるね。

>IdSocketHandle.pasに原因があるということでしょうか?
使用Indyバージョンが不明だけど、未定義エラーが出るなら、
uses IdSocketHandle;


アルト  2005-03-27 01:56:28  No: 13896

Indyと秋の空さん、ン?さんありがとうございます!
>uses IdSocketHandle;
を追加することでコンパイルが通りました。
しかし。。このアプリ、2つ以上は立ち上がりません。ブロードキャストを確認したいのですが、ウチにはPCが一台しかないのですが・・
よい方法を教えてもらえるとうれしいです。


いま春休み?  2005-03-27 02:26:37  No: 13897

大学の研究室で動作確認できないのかな?
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回だけしか返信してくれない。


アルト  2005-03-27 04:07:35  No: 13898

ちょうど今春休みで、実家に帰省しておりまして(><;
>255.255.255.255のIPに送信して自分のPCに届いていれば、一応ブロードキャスト出来ていることになると思うけど…
の255.255.255.255のブロードキャストアドレス?はどこに記述するべきなんでしょう。理論はわかりますが、Delphiでの記述がわかりません。。
また、自分自身に届いただけでは、皆にブロードキャストできているかはわからないのではないでしょうか?
2つ以上起動させて実験したいのですが・・。

わかる方、よろしくお願いします。


アルト  2005-03-30 21:42:15  No: 13899

2つ以上の起動はどうやっても無理でしょうか?
ポート番号を変えたり、フォルダを別にして起動させたりしてみましたが、やっぱりだめでした。
どうにかして2つ起動させたいのですが、方法はありませんでしょうか・・


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

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






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