請問如何取得本機電腦所有 IP ? |
答題得分者是:hagar
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
取得本機電腦 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 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
十分感謝, 為了當成函式方便使用, 做了點修改和測試分享
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 發送簡訊給我 |
|
scarfman
一般會員 發表:3 回覆:4 積分:1 註冊:2003-06-06 發送簡訊給我 |
引言: 請問如果不使用 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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |