Вот код:
Код:
function lookupName(name:string):TInAddr;
procedure ShowWinSockError(FuncName:string);
var
Form1: TForm1;
implementation
////////////////////////////////////////////////////
procedure ShowWinSockError(FuncName:string);
var
sErorrString:String;
begin
sErorrString:='Неизвестная ошибка';
case WSAGetLastError() of
WSANOTINITIALISED:sErorrString:='Необходимо инициализировать WinSock';
WSAENETDOWN:sErorrString:='Проблема с сетью';
WSAEAFNOSUPPORT:sErorrString:='указанная система адресации не поддерживается';
WSAEINVAL:sErorrString:='сокет уже связан с адресом';
WSAENOBUFS:sErorrString:='недостаточно памяти';
WSAEPROTONOSUPPORT:sErorrString:='Протокол не поддерживается';
WSAENOTSOCK:sErorrString:='неверный дескриптор хендла';
WSAEISCONN:sErorrString:='сокет уже подключен';
WSAEMFILE:sErorrString:='больше нет доступных сокетов';
WSAEADDRINUSE:sErorrString:='адрес уже используется';
WSAEINPROGRESS:SErorrString:='Выполняется блокирующая операция WinSock 1.1';
WSAEADDRNOTAVAIL:SErorrString:='Адрес недоступен или неверен';
WSANO_DATA:SErorrString:='DNS не может выдать IP адресс узла!';
end;
MessageBox(0,Pchar('Ошибка в функции'+FuncName+'-'+SerorrString),'ошибка',0);
end;
/////////////////////////////////////////////////////////////////////////
{$R *.dfm}
function lookupName(name:string):TInAddr;//получение адреса для
//соединения
var
HostEnt:PHostEnt;
InAddr:TInAddr;
begin
if name[4]='.' then//если точка после первых трем символов IP адрес
begin
InAddr.S_addr:=inet_addr(PWideChar(name))
end
else
begin
HostEnt:=gethostbyname(PWideChar(name));
FillChar(InAddr,sizeof(InAddr),0);
if HostEnt<> nil then
begin
inaddr.S_un_b.s_b1:=ord(HostEnt^.h_addr^[0]);
inaddr.S_un_b.s_b2:=ord(HostEnt^.h_addr^[1]);
inaddr.S_un_b.s_b3:=ord(HostEnt.h_addr^[2]);
inaddr.S_un_b.s_b4:=ord(HostEnt^.h_addr^[3]);
end
else
begin
ShowWinSockError(' GetHostbyName ');//Вот здесь все время вылетает
//ошибка WSANO_DATA (код 11004)
end;
end;
Result:=InAddr;
end;
///////////////////////////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
var
info:TWSADATA;
hsocket:Thandle;
serv:sockAddr_in;
res:integer;
begin
WSAStartup(MAKEWORD(2,0),info);
hsocket:=socket(PF_INET,SOCK_STREAM,IPPROTO_IP);
if hsocket=INVALID_SOCKET then
begin
ShowWinSockError('socket');
end
else
begin
serv.sin_family:=AF_INET;
serv.sin_port:=htons(80);
serv.sin_addr:=LookupName('google.ru');
res:=Connect(hsocket,@serv,sizeof(serv));
if res=SOCKET_ERROR then
begin
ShowWinSockError('Connect');
end;
CloseSocket(hsocket);
end
end;
Когда я читал ее(ошибка WSANO_DATA) описания говорится о том, что DNS не смотря на верный формат запроса не ожет выдать необходимые данные, однако pingуется одноименной утилитой Windows все на ура.В чем же проблема? Используется:
Winsock2
Delphi 2010
Windows Vista