同一LAN内のIPAdressやMacAdressを取得するには?


ペン太  2006-07-09 11:02:19  No: 22443

こんばんは。いつもお世話になっています。

早速ですが質問させてください。
タイトルにあるように同一LAN内のIPAdressやMacAdressを取得するには
どのようにすればよいのでしょうか?

この手のプログラミングはまったくしたことが無く途方に暮れています。
もしお解りの方がいらっしゃいましたら、ご教示いただけないでしょうか?
サンプルソースの場所だけでも非常にありがたいので、宜しくお願いします。


Fusa  2006-07-09 14:40:00  No: 22444

設定を正しくして
動作させてください。

function GetHostName(Ip : String) : String;
var
  PH : PHostEnt;
  InAddr: TInAddr;
  WSADATA : TWSADATA;
begin
  Result := '';
  if Ip = '' then exit;
  InAddr.S_addr := inet_addr(PChar(Ip));
  WSAStartup(MakeWord(1,1) , WSADATA);  //MakeWord(1,1)=$0101

  PH := gethostbyaddr(@InAddr,4,PF_INET);

  if PH = nil then Exit;
  Result := string(ph^.h_name);
  WSACleanup;
end;

function GetIpAddress(HostName : String) : String;
var
  PH : PHostEnt;
  InAddr: TInAddr;
  WSADATA : TWSADATA;
begin
  Result := '';
  if HostName = '' then exit;
  WSAStartup(MakeWord(1,1), WSADATA);

  PH := gethostbyname(PChar(HostName));

  if PH = nil then Exit;
  InAddr := PInAddr(ph^.h_addr_list^)^;
  Result := inet_ntoa(InAddr);
  WSACleanup;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  Memo1.Lines.Add( GetHostName('127.0.0.1') );
  Memo1.Lines.Add( GetIpAddress(GetHostName('127.0.0.1')) );
  Memo1.Lines.Add( GetIpAddress('www.yahoo.co.jp') );
end;

参考
[Delphi-ML:33669] Re: IP アドレス(?) からの変換
http://www2.big.or.jp/~osamu/Delphi/browse.cgi?index=33669

こける Wired-Winsockを使ってみようぜ-3.住所と氏名 '97/11/23
http://www.asahi-net.or.jp/~nk2w-ishr/winsock3.htm


ペン太  2006-07-09 16:11:36  No: 22445

返信ありがとうございます。

ホストからIPアドレス
IPアドレスからホスト名
ありがたく使わせていただきます。

先ほどまで調べてみると、他にも
Lan内のIPアドレスからMACアドレスへ変換
Lan内のコンピュータ名からプライベートIPアドレスの変換は
なんとか見つけることが出来ました。

しかし、同一LAN内の各コンピューター名(IP, MacAddressでも可)の
取得がわかりませんでした。
キャッシュしているARPテーブルを参照出来れば
目的が果たせそうな気もするのですが、まだソースを見つけるにいたっていません。

考え方を変えて同じWORKGROUPのコンピュータ名の列挙でも
目的が果たせそうな気もするのですが、これもまたやりかたがわからず・・・。

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


Fusa  2006-07-10 00:14:53  No: 22446

わたしも、192.168.123.0〜255まで
pingを投げて(Indyのコンポーネントでできる)
返事があった物に対してのみ、GetHostNameを行って

検索したりしているのですが
遅くて使い物にならないんですよね...

こける Wiredにのっている、
非同期通信の事はまだ勉強できてないっす。

いい方法がありましたら、知りたいです。
誰か教えてください。


kkk  2006-07-10 12:49:14  No: 22447

ARPでよかったら
http://users.pandora.be/dirk.claessens2/software.htm
のtcpipmon15.zipでサンプルが取得できます
ARPの場合キャッシュの情報を見ることになるので、必ずしも現在接続しているPCの一覧が取得できるとは限りませんが。
(一定時間アクセスしないとキャッシュから消える)


kkk  2006-07-10 13:14:53  No: 22448

WorkGroup内のリストは以下で取得できました
http://www.swissdelphicenter.ch/torry/showcode.php?id=2177
PCの環境によっては取得に時間がかかるかも?


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

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






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