Code: uses Winsock; function GetIPFromHost(HostName:PChar): string; var HEnt: pHostEnt; WSAData: TWSAData; begin WSAStartup($0101, WSAData); HEnt := gethostbyname(HostName); Result := inet_ntoa(PInAddr(HEnt^.h_addr_list^)^ ); WSACleanup; end; Ошибки проверяй сам
Главная ошибка многие - это писать в Делфи как хочется, а не как надо ) Я имею в виду правильность написания имен апи функция. GetHostByName считается не правильным написание. Правильное gethostbyname итп. и дело не в том что в делфи пофигу на регистр а в Си нет. А в том что это имена апишек и если искать их через GetProcAddress то важен регистр символов. ПО этому лучше писать всё сразу в сишном стиле. Потому как это будет более удобно для переписывания на С/С++ (если конечно такое понадобиться когданить ))
Поправил регистр имен, но на С/С++ можно написать и более красиво, к тому же используется функция PInAddr которая есть только в Delphi.
PInAddr это не функция это тип. И ты юзаешь его для преобразования. А на си можно и так сделать, чтобы получить адрес сразу в готовом для использовании виде. Ну и в делфи тож можно также делать. Code: ULONG Host2Ip(char * host) { struct hostent * p; ULONG ret; p = gethostbyname(host); if (p) { ret = *(ULONG*)(p->h_addr); } else { ret = INADDR_NONE; } return ret; }
slesh функция хороша и интелектуально понятно, но есть два факта 1) host ведь можно указать строкой "127.0.0.1" 2) gethostbyname - у одного адреса может быть несколько ip адресов на то и массив в структуре HOSTENT Code: struct hostent { char FAR * h_name; // официальное имя узла char FAR * FAR * h_aliases; // альтернативные имена узла (массив строк) short h_addrtype; // тип адреса short h_length; // длина адреса (как правило AF_INET) char FAR * FAR * h_addr_list; // список указателей на IP-адреса // ноль - конец списка }; хотя и я ленюсь это учитывать