FDELPHI 12 /RE:05201 RE:ルータのグローバルIPアドレス  こんにちは、KOH さん 》なんか簡単に考えていたのですが 》難しいことだとよくわかりました。 プログラムを動かしているパソコンそれ自身の情報を取得するのではなく、他の 装置の情報を取得する場合、いくらか複雑になるのは仕方のないことです。特に 通信系の場合、状態遷移だの例外処理だのを真面目に実装すると際限なく複雑に なって行ってしまうでしょう。 でも、いろんなところを手を抜けば、わりと簡単に可能です。 とりあえず、SMTP サーバ利用版です。 type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; IdTelnet1: TIdTelnet; procedure Button1Click(Sender: TObject); procedure IdTelnet1DataAvailable(Buffer: String); procedure IdTelnet1Connected(Sender: TObject); procedure IdTelnet1Disconnected(Sender: TObject); end; var Form1: TForm1; StrLst: TStringList; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin StrLst := TStringList.Create; IdTelnet1.Host := Edit1.Text; IdTelnet1.Port := 25; IdTelnet1.Connect; end; procedure TForm1.IdTelnet1DataAvailable(Buffer: String); const CR = #13; LF = #10; var Start,Stop: Integer; begin if StrLst.Count = 0 then StrLst.Add(''); Start := 1; Stop := Pos(CR, Buffer); if Stop = 0 then Stop := Length(Buffer) + 1; while Start <= Length(Buffer) do begin with StrLst do begin Strings[Count-1] := Strings[Count-1] + Copy(Buffer, Start, Stop - Start); if Buffer[Stop] = CR then Add(''); end; Start := Stop + 1; if Start > Length(Buffer) then Break; if Buffer[Start] = LF then Start := Start + 1; Stop := Start; while (Buffer[Stop] <> CR) and (Stop <= Length(Buffer)) do Stop := Stop + 1; end; end; procedure TForm1.IdTelnet1Connected(Sender: TObject); begin IdTelnet1.Writeln('HELO x'); IdTelnet1.Writeln('QUIT'); end; procedure TForm1.IdTelnet1Disconnected(Sender: TObject); var i,j,pc: Integer; str: string; begin pc := 0; for i := 0 to StrLst.Count -1 do begin str := StrLst[i]; for j := 1 to length(str) do begin if str[j] in ['0'..'9','.',' '] then begin Edit2.Text := Edit2.Text + str[j]; if str[j] = '.' then inc(pc); end else begin if pc = 3 then exit; Edit2.Text := ''; pc:=0; end end; end; StrLst.Free; end; end. いろんなサンプルからのルーチンの寄せ集めなので、ひどいプログラムだなぁ。 StrLst なんかきちんと開放できているのかな。 実際に使う場合には、try 節の1つもつけてやって下さい。 もしかしたら HTTP 版の方が簡単かも。どこかのWEBサーバを使って間接的に 情報を取得するというだけでなく、直接そのルータの設定用のページからも情報 をとれるかもしれませんし。 あ、そうだ、もし特定の機種のルータで取得できればいいというのであれば、そ のルータの機種名を書いてみてください。同じ機種を使っている人から、もっと いい方法が提示されるかもしれませんから。telnet で直接そのルータをアクセス するとか、SNMP で情報を取得する、なんていう方法もあるかもしれません。                                 としき