Консультация № 49224
15.07.2006, 20:53
0.00 руб.
0 2 2
Здравствуйте. Как в Delphi, работая с сервер-клиент приложением, зная имя компьютера в сети (сервера), получить его ip адрес? Спасибо.

Обсуждение

Неизвестный
16.07.2006, 11:29
общий
это ответ
Здравствуйте, Сергей Николаевич!

Почитайте <a href=http://delphiworld.narod.ru/base/name_to_ip.html target=_blank>это</a> и <a href=http://delphiworld.narod.ru/base/convert_domain_to_ip.html target=_blank>вот это</a>, по-моему, это то, что Вам нужно.

Удачи!!!
Неизвестный
16.07.2006, 11:44
общий
это ответ
Здравствуйте, Сергей Николаевич!
В приложении программа - пример преобразования IP адреса в Host имя, и обратно, а также работа с DNS адресом

Приложение:
unit dnip;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Winsock, ExtCtrls, Math;type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Edit1: TEdit; Label2: TLabel; Button2: TButton; Bevel1: TBevel; Edit2: TEdit; Label3: TLabel; Label4: TLabel; Bevel2: TBevel; Button3: TButton; Edit3: TEdit; Label5: TLabel; Label6: TLabel; Bevel3: TBevel; Label7: TLabel; Bevel4: TBevel; Button4: TButton; Edit4: TEdit; Label8: TLabel; Label9: TLabel; Button5: TButton; Edit5: TEdit; Label10: TLabel; Label11: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Label4DblClick(Sender: TObject); procedure Label1DblClick(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Label6DblClick(Sender: TObject); procedure Label9DblClick(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Label11DblClick(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}function IPAddrToName(IPAddr: string): string;var SockAddrIn: TSockAddrIn; HostEnt: PHostEnt; WSAData: TWSAData;begin WSAStartup($101, WSAData); SockAddrIn.sin_addr.s_addr:=inet_addr(PChar(IPAddr)); HostEnt:=GetHostByAddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET); if HostEnt<>nil then Result:=StrPas(Hostent^.h_name) else Result:=‘‘;end;procedure TForm1.Button1Click(Sender: TObject);begin Label1.Caption:=‘Name: ‘+IPAddrToName(Edit1.Text);end;procedure TForm1.Button2Click(Sender: TObject);var // Сохраняем оригинальное значение IP адреса OrgVal: string; // части оригинального IP O1,O2,O3,O4: string; // шестнадцатиричные части H1,H2,H3,H4: string; // Здесь будут собраны все шестнадцатиричные части HexIP: string; XN: array[1..8] of Extended; Flt1: Extended; Xc: Integer;begin // Сохраняем в обратном порядке для простого случая Xn[8]:=IntPower(16,0);Xn[7]:=IntPower(16,1); Xn[6]:=IntPower(16,2);Xn[5]:=IntPower(16,3); Xn[4]:=IntPower(16,4);Xn[3]:=IntPower(16,5); Xn[2]:=IntPower(16,6);Xn[1]:=IntPower(16,7); // Сохраняем оригинальный IP адрес OrgVal:=Edit2.Text; O1:=Copy(OrgVal,1,Pos(‘.‘,OrgVal)-1);Delete(OrgVal,1,Pos(‘.‘,OrgVal)); O2:=Copy(OrgVal,1,Pos(‘.‘,OrgVal)-1);Delete(OrgVal,1,Pos(‘.‘,OrgVal)); O3:=Copy(OrgVal,1,Pos(‘.‘,OrgVal)-1);Delete(OrgVal,1,Pos(‘.‘,OrgVal)); O4:=OrgVal; H1:=IntToHex(StrToInt(O1),2);H2:=IntToHex(StrToInt(O2),2); H3:=IntToHex(StrToInt(O3),2);H4:=IntToHex(StrToInt(O4),2); // Получаем шестнадцатиричное значение IP адреса HexIP:=H1+H2+H3+H4; // Преобразуем это большое шестнадцатиричное значение в переменную Float Flt1:=0; for Xc:=1 to 8 do begin case HexIP[Xc] of ‘0‘..‘9‘: Flt1:=Flt1+(StrToInt(HexIP[XC])*Xn[Xc]); ‘A‘: Flt1:=Flt1+(10*Xn[Xc]); ‘B‘: Flt1:=Flt1+(11*Xn[Xc]); ‘C‘: Flt1:=Flt1+(12*Xn[Xc]); ‘D‘: Flt1:=Flt1+(13*Xn[Xc]); ‘E‘: Flt1:=Flt1+(14*Xn[Xc]); ‘F‘: Flt1:=Flt1+(15*Xn[Xc]); end; end; Label4.Caption:=‘Number: ‘+FloatToStr(Flt1);end;procedure TForm1.Label4DblClick(Sender: TObject);begin Edit2.Text:=Label4.Caption;end;procedure TForm1.Label1DblClick(Sender: TObject);begin Edit1.Text:=Label1.Caption;end;const WINSOCK_VERSION=$0101;procedure TForm1.Button3Click(Sender: TObject);var WSAData: TWSAData; p: PHostEnt;begin WSAStartup(WINSOCK_VERSION, WSAData); p:=GetHostByName(PChar(Edit3.Text)); Label6.Caption:=‘IP: ‘+inet_ntoa(PInAddr(p.h_addr_list^)^); WSACleanup;end;// возвращает IP адресfunction LocalIP: string;type TaPInAddr=array [0..10] of PInAddr; PaPInAddr=^TaPInAddr;var phe:PHostEnt; pptr:PaPInAddr; Buffer:array [0..63] of char; i:Integer; GInitData:TWSADATA;begin WSAStartup($101, GInitData); Result:=‘‘; GetHostName(Buffer, SizeOf(Buffer)); phe:=GetHostByName(buffer); if phe=nil then Exit; pptr:=PaPInAddr(Phe^.h_addr_list); i:=0; while pptr^[i]<>nil do begin result:=StrPas(inet_ntoa(pptr^[i]^)); Inc(i); end; WSACleanup;end;procedure TForm1.FormCreate(Sender: TObject);begin Label7.Caption:=‘Local IP: ‘+LocalIP;end;procedure TForm1.Button4Click(Sender: TObject);var wsdata: TWSAData; hostName: array [0..255] of char; hostEnt: PHostEnt; addr: PChar;begin WSAStartup ($0101, wsdata); try GetHostName(hostName, sizeof (hostName)); StrPCopy(hostName,Edit4.Text); hostEnt:=GetHostByName(hostName); if Assigned(hostEnt) then if Assigned(hostEnt^.h_addr_list) then begin addr:=hostEnt^.h_addr_list^; if Assigned(addr) then begin Label9.Caption:=Format(‘%d.%d.%d.%d‘,[byte(addr[0]), byte(addr[1]),byte(addr[2]),byte(addr[3])]); end; end; finally WSACleanup; end;end;procedure TForm1.Label6DblClick(Sender: TObject);begin Edit3.Text:=Label6.Caption;end;procedure TForm1.Label9DblClick(Sender: TObject);begin Edit4.Text:=Label9.Caption;end;function IPAddrToCompName(IPAddr: string): string;var SockAddrIn: TSockAddrIn; HostEnt: PHostEnt; WSAData: TWSAData;begin WSAStartup($101, WSAData); SockAddrIn.sin_addr.s_addr:=inet_addr(PChar(IPAddr)); HostEnt:=gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET); if HostEnt<>nil then Result:=StrPas(Hostent^.h_name) else Result:=‘‘;end;procedure TForm1.Button5Click(Sender: TObject);begin Label11.Caption:=‘Name: ‘+IPAddrToCompName(Edit5.Text);end;procedure TForm1.Label11DblClick(Sender: TObject);begin Edit5.Text:=Label11.Caption;end;end.
Форма ответа