winsock, tłumaczenie URL na IP...

0

Bawię się w winsock, mam tylko jeden problem, użytkownik będzie wpisywał adresy www stron, z którymi program będzie się łączył i wysyłał dane.
Nie wiem tylko, która funkcja przetłumaczy mi adres www na adres IP owej strony, a winsock nie przyjmie mi czegoś w stylu:
dane.sin_addr.S_addr:= inet_addr('54.stronadomowa.pl');

byłbym wdzięczny za info o funkcji, czy za cokolwiek

0

www.torry.net > Tips > wpisz "IP" i kliknij "Search" ;]

0

http://www.swissdelphicenter.ch/torry/showcode.php?id=2228 <- tylko IP funkcja przyjmuje i zwraca hosta, czyli wklepię adres IP strony to zwróci url stronki, a chcę odwrotnie, ale adresu www nie przyjmuje chyba...

0
pan_smierci napisał(a)

http://www.swissdelphicenter.ch/torry/showcode.php?id=2228 <- tylko IP funkcja przyjmuje i zwraca hosta, czyli wklepię adres IP strony to zwróci url stronki, a chcę odwrotnie, ale adresu www nie przyjmuje chyba...

jestes pewien?
napisane wyraznie :"get the IP from a given URL" czyli podajesz url a dostajesz IP

0

sprawdzałem zanim odpisałem na posta i funkcja mi adresów www nie przyjmuje, ale może coś źle robię

0

faktycznie na odwrot dziala ta funkcja :/
nie lapie czemu tak napisali...

ta powinna byc ok (tez z torryego):

function GetIPFromHost(const HostName: string): string;
type
  TaPInAddr = array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  i: Integer;
  GInitData: TWSAData;
begin
  WSAStartup($101, GInitData);
  Result := '';
  phe := GetHostByName(PChar(HostName));
  if phe = nil then Exit;
  pPtr := PaPInAddr(phe^.h_addr_list);
  i := 0;
  while pPtr^[i] <> nil do
  begin
    Result := inet_ntoa(pptr^[i]^);
    Inc(i);
  end;
  WSACleanup;
end;
0

wow, ten drugi kod działa, dziękuję ;D
(jeszcze tylko będę musiał go zrozumieć, msdn + zmienianie kodu)

//edit
gdyby ktoś mógł co nieco tutaj napisać o kodzie to byłbym wdzięczny:

function GetIPFromHost(const HostName: string): string; //wiem
type
  TaPInAddr = array[0..10] of PInAddr; //tablica typu PInAddr? nie rozumiem
  PaPInAddr = ^TaPInAddr; //wskaźnik wskazujący na TaPInAddr, ta?
var
  phe: PHostEnt; //wiem
  pptr: PaPInAddr; //a to po co?
  i: Integer; //wiem
  GInitData: TWSAData; //wiem
begin
  WSAStartup($101, GInitData); //wiem (albo MakeWord(2,2) itd)
  Result := '';
  phe := GetHostByName(PChar(HostName)); //wiem
  if phe = nil then Exit; //wiem
  pPtr := PaPInAddr(phe^.h_addr_list); //jak to czytać? zmienna pPtr to typ wskaźnika, który wskazuje na
//PaPInAddr, a ten z kolei wskazuje na TaPInAddr ee  [glowa], który jest tablicą typu PInAddr eee?  [glowa] //i ten phe teoretycznie ma już hosta pobranego? i przypisuje te dane temu typowi (tej tablicy)?

  i := 0;
  while pPtr^[i] <> nil do //po ptaszku, tzn po ^ kropki nie robi się? dopóki element tablicy nie jest pusty
//to wykonuj... (tak to czytać?)
  begin
    Result := inet_ntoa(pptr^[i]^); //zwróć po kolei każdy element tablicy przetłumaczony tym czymś dziwnym (inet_ntoa), którego opis widziałem na msdn
    Inc(i); //i++
  end;
  WSACleanup; //zwolnienie wsa
end;

tak więc zwracam się do was z prośbą o podanie więcej info o tym, po prostu bardzo zależy mi by rozumieć kod, którego chcę używać (idę spać, 4 nad ranem już)

0

dorzucam kolejny kodzik

function URLNaIP(www: AnsiString): AnsiString;
type
  tPinAdr = PInAddr;
var
  WSAData: TWSAData;
  HostEnt: PHostEnt;

begin
  WSAStartup(MakeWord(2,2), WSAData);
  HostEnt:= gethostbyname(PAnsiChar(www));

  Result:= 'IP: ' + inet_ntoa(tPinAdr(HostEnt^.h_addr_list^)^);

  WSACleanup;
end;

//i pod buttonem Label1.Caption:= URLNaIP(Edit1.Text);

i tak nie bardzo wiem co robiłem pisząc to, najpierw w necie przeglądałem jakieś dziwaczne przykłady (niektóre hardkorowo przydługawe z New();, ConCatem do łączenia, wieloma tablicami i pointerami ;/, następnie szukałem "alternatywnego" sposobu po swojemu (czyli metoda prób i błędów). Powyższy kod można na 2 sposoby napisać (po mojemu, bo w necie znalazłem jakieś ze 3-5 innych, ale cholernie pogmatwanych)

type
  tPinAdr = PInAddr;
............
  Result:= 'IP: ' + inet_ntoa(tPinAdr(HostEnt^.h_addr_list^)^);

albo tak:

type
  tPinAdr = in_addr;
  pPinAdr = ^tPinAdr;
..........
  Result:= 'IP: ' + inet_ntoa(pPinAdr(HostEnt^.h_addr_list^)^);

Czy znacie jakieś książki z wyjaśnieniem co to dokładnie te typy itd, chodzi o:
type
jakas_nazwa = TypZmiennej

Spotkałem się jedynie z którkimi opisami w stylu (a te wyżej po znaku "równa się" nie mają słówka "class"):
type
nazwa = class
i tu niżej zmienne (czasem pod private)
i niżej procedury, funkcje
czasem konstruktor i destruktor, a w initialization Create
Doświadczenia z tym nie mam żadnego (pomijając 10 minutowy kod i użycie type (klasy) jako zbioru zmiennych, bo chciałem sprawdzić, czy mogę zamiast pod "var" się tak pobawić i było w porządku.

0

kiedyś napisałem coś takiego: obsługuje zarówno adresy IP (wtedy ich nie rusza), jak i adresy DNS (wtedy je konwertuje na IP)

function makeinaddr(adres:string):TInAddr;
var
  hostent:PHostEnt;
type
  pcardinal=^cardinal;
begin
  result.s_addr:=inet_addr(pchar(adres));
  if result.s_addr=INADDR_NONE then
  begin
    hostent:=gethostbyname(pchar(adres));
    if hostent<>nil then
      result.s_addr:=pcardinal(hostent^.h_addr)^;
  end;
end;

oczywiście WSAStartup jest potrzebne, ale nie przy każdym wywołaniu funkcji - wystarczy raz na początku programu.

użycie w twoim przypadku to cos w deseń

dane.sin_addr:=makeinaddr('54.stronadomowa.pl');

– zakładając że sin_addr jest typu TInAddr.

0

nalzey pamietac, ze pod adresem url moze kryc sie kilka IP te kody tego nie uwzgledniaja. Podaja pierwszy albo ostatni.

0
dsg napisał(a)

nalzey pamietac, ze pod adresem url moze kryc sie kilka IP te kody tego nie uwzgledniaja. Podaja pierwszy albo ostatni.

a polecenie ping w wierszu poleceń, który podaje? :-)
//no chyba nie dostanę jakiegoś dziwnego IP, z którym się nie połączę (i o wysyłaniu zapytań będę mógł zapomnieć)... Te inne IP to niby jakie? bo nie bardzo rozumiem :(

0

Widze lenistwo do granic mozliwosci

przykladzik trzeba bylo sobie zbudowac...

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function GetIPFromHost(const HostName: string): string; //wiem
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
uses winsock;

{$R *.dfm}
function TForm1.GetIPFromHost(const HostName: string): string; //wiem
type
  TaPInAddr = array[0..10] of PInAddr; //tablica typu PInAddr? nie rozumiem
  PaPInAddr = ^TaPInAddr; //wskaźnik wskazujący na TaPInAddr, ta?
var
  phe: PHostEnt; //wiem
  pptr: PaPInAddr; //a to po co?
  i: Integer; //wiem
  GInitData: TWSAData; //wiem
begin
  WSAStartup($101, GInitData); //wiem (albo MakeWord(2,2) itd)
  Result := '';
  phe := GetHostByName(PChar(HostName)); //wiem
  if phe = nil then Exit; //wiem
  pPtr := PaPInAddr(phe^.h_addr_list); //jak to czytać? zmienna pPtr to typ wskaźnika, który wskazuje na
//PaPInAddr, a ten z kolei wskazuje na TaPInAddr ee  [glowa], który jest tablicą typu PInAddr eee?  [glowa] //i ten phe teoretycznie ma już hosta pobranego? i przypisuje te dane temu typowi (tej tablicy)?

  i := 0;
  while pPtr^[i] <> nil do //po ptaszku, tzn po ^ kropki nie robi się? dopóki element tablicy nie jest pusty
//to wykonuj... (tak to czytać?)
  begin
    Result := inet_ntoa(pptr^[i]^); //zwróć po kolei każdy element tablicy przetłumaczony tym czymś dziwnym (inet_ntoa), którego opis widziałem na msdn
    Memo1.Lines.Add(Result);
    Inc(i); //i++
  end;
  WSACleanup; //zwolnienie wsa
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    GetIPFromHost('microsoft.com');
end;

end.

poczytac co to jest domena i tam jest napisane kiedy stosuje i dlaczego wiele adresow IP dla jednej domeny. Poczytac o funkcjach uzytych w kodzie (swoja droga przestarzalych juz nie zalapuja IP6) ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1