全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3582
推到 Plurk!
推到 Facebook!

請問如何取得本機電腦所有 IP ?

答題得分者是:hagar
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-29 16:18:33 IP:210.69.xxx.xxx 未訂閱
取得本機電腦 IP 程式如下, 但這只能取得一個,  請問如何取得本機電腦所有 IP ? 謝謝    

unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WinSock;    type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    function GetIP: String;
var
  wVersionRequired: Word;
  WSData: TWSAData;
  Status: Integer;
  Name: array[0..255] of Char;
  HostEnt: PHostEnt;
  IP: PChar;
  host_ip:string;
begin
  wVersionRequired := MAKEWORD(1, 1);
  Status := WSAStartup(wVersionRequired, WSData);
  if Status <> 0 then begin
    MessageDlg('Error Occured', mterror, [mbOK], 0);
    exit;
  end;      gethostname(name,sizeof(name));
  HostEnt := GetHostByName(@Name);
  if HostEnt <> nil then begin
    IP := HostEnt^.h_addr_list^;
    host_ip := IntToStr(Integer(IP[0]))
       '.'   IntToStr(Integer(IP[1]))
       '.'   IntToStr(Integer(IP[2]))
       '.'   IntToStr(Integer(IP[3]));
  end
  else
    host_ip := '(N/A)';      Result:=host_ip;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Text:=GetIP;
end;    end.
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-29 17:39:15 IP:202.39.xxx.xxx 未訂閱
用 Indy 試試:
uses IdStack;    procedure TForm1.Button1Click(Sender: TObject);
var
  IdStack: TIdStack;
begin
  IdStack := TIdStack.CreateStack;
  try
    Memo1.Lines.Text := IdStack.LocalAddresses.Text;
  finally
    IdStack.Free;
  end;
end;
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-30 10:14:40 IP:210.69.xxx.xxx 未訂閱
十分感謝, 為了當成函式方便使用, 做了點修改和測試分享    
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;    type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}

uses
Unit2;    procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.Text := GetAllIP;
  Memo1.Lines.Add('');
  Memo1.Lines.Add(Memo1.Lines[0]);
end;    end.    

// 使用 Delphi 7 Eneterprise 的 Indy
// GetIP 取得所有本機電腦的 IP 位址    unit Unit2;    interface      function GetAllIP:String;    implementation    uses IdStack;    function GetAllIP:String;
var
  IdStack: TIdStack;
begin
  IdStack := TIdStack.CreateStack;
  try
    Result := IdStack.LocalAddresses.Text;
  finally
    IdStack.Free;
  end;
end;    end.
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-30 12:33:17 IP:210.69.xxx.xxx 未訂閱
請問如果不使用 Indy 該如何寫 ? 如果要抓到每個 IP 和它的搭配 mask , 該如何改, Thanks !
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
scarfman
一般會員


發表:3
回覆:4
積分:1
註冊:2003-06-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-08 21:10:33 IP:211.23.xxx.xxx 未訂閱
引言: 請問如果不使用 Indy 該如何寫 ? 如果要抓到每個 IP 和它的搭配 mask , 該如何改, Thanks !
以下是在下的程式中使用的函數, 用用看吧!
interface      function HostNameToIP(AHostName: String; var AIP: String): Boolean; overload;
  function HostNameToIP(AHostName: String; AIPs: TStrings): Boolean; overload;
  function IsStringAnIP(const HostNameOrIP: String): Boolean;    implementation    {==============================================================================}
{   判斷字串是IP或是HostName, 若是IP則回傳True                                 }
{==============================================================================}
function IsStringAnIP(const HostNameOrIP: String): Boolean;
var
  sByte,
  sUnknown: String;
  iPos:     Integer;      function IsStringAByteNumber(const s: String): Boolean;
  var
    i: Integer;
  begin
    Result := False;
    try
      i := StrToInt(s);
      Result := ((i >= 0) and (i < 256));
    except
    end;
  end;    begin
  Result := False;
  sUnknown := HostNameOrIP;
  // Check Byte1
  iPos := Pos('.', sUnknown);
  if (iPos = 0) or (iPos = 1) then Exit;
  sByte := Copy(sUnknown, 1, iPos-1);
  Delete(sUnknown, 1, iPos);
  if not IsStringAByteNumber(sByte) then Exit;
  // Check Byte2
  iPos := Pos('.', sUnknown);
  if (iPos = 0) or (iPos = 1) then Exit;
  sByte := Copy(sUnknown, 1, iPos-1);
  if not IsStringAByteNumber(sByte) then Exit;
  // Check Byte3
  iPos := Pos('.', sUnknown);
  if (iPos = 0) or (iPos = 1) then Exit;
  sByte := Copy(sUnknown, 1, iPos-1);
  Delete(sUnknown, 1, iPos);
  if not IsStringAByteNumber(sByte) then Exit;
  // Check Byte4
  iPos := Pos('.', sUnknown);
  if (iPos = 0) or (iPos = 1) then Exit;
  sByte := Copy(sUnknown, 1, iPos-1);
  Delete(sUnknown, 1, iPos);
  if not IsStringAByteNumber(sByte) then Exit;
  Result := True;
end;    {==============================================================================}
{   函式敘述:                                                                 }
{       將指定的電腦主機名稱(HostName)轉換成IP位址                             }
{   參數:                                                                     }
{       AHostName:                                                             }
{           要轉換的電腦主機名稱。                                             }
{       AIP:                                                                   }
{           若成功,由此傳回轉換後的IP。                                       }
{   傳回值:                                                                   }
{       成功傳回True,失敗傳回False。                                          }
{==============================================================================}
function HostNameToIP(AHostName: String; var AIP: String): Boolean;
var
  wsa:          TWSAData;
  aBuffer:      array [0..255] of Char;
  hostent:      PHostEnt;
  pcAddr:       PChar;
begin
  Result := False;
  if WSAStartup($0101, wsa) <> 0 then
    Exit;
  try
    if gethostname(aBuffer, SizeOf(aBuffer)) <> 0 then
      Exit;
    StrPCopy(aBuffer, AHostName);
    hostent := gethostbyname(aBuffer);
    if hostent = nil then
      Exit;
    if (hostent^.h_addr_list <> nil) then
    begin
      Result := True;
      pcAddr := hostent^.h_addr_list^;
      if (pcAddr <> nil) then
      begin
        AIP := Format('%d.%d.%d.%d', [Byte(pcAddr[0]), Byte(pcAddr[1]),
          Byte(pcAddr[2]), Byte(pcAddr[3])]);
      end;
    end;
  finally
    WSACleanup;
  end;
end;    function HostNameToIP(AHostName: String; AIPs: TStrings): Boolean;
var
  wsa:          TWSAData;
  aBuffer:      array [0..255] of Char;
  hostent:      PHostEnt;
  s:            String;
  p:            ^PChar;
  addr:         in_addr;
  k:            DWORD;
begin
  Result := False;
  if WSAStartup($0101, wsa) <> 0 then
    Exit;
  try
    if gethostname(aBuffer, SizeOf(aBuffer)) <> 0 then
      Exit;
    StrPCopy(aBuffer, AHostName);
    if IsStringAnIP(AHostName) then // 如果是IP字串, 先取得HostName
    begin
      k := inet_addr(aBuffer);
      if (k <> INADDR_NONE) then
      begin
        hostent := gethostbyaddr(@k, 4, PF_INET);
        if (hostent <> nil) then
          StrCopy(aBuffer, hostent.h_name);
      end;
    end;
    hostent := gethostbyname(aBuffer);
    if hostent = nil then
      Exit;
    if (hostent^.h_addr_list <> nil) then
    begin
      Result := True;
      p := Pointer(hostent^.h_addr_list);
      while (p <> nil) and (p^ <> nil) do
      begin
        CopyMemory(@addr, p^, sizeOf(addr));
        s := inet_ntoa(addr);
        AIPs.Add(s);
        Inc(p);
      end;
    end;
  finally
    WSACleanup;
  end;
end; 
系統時間:2024-07-05 2:52:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!