Делаю простую программу для linux.
На компьютере, в файле hosts, прописано соответствие типа 127.0.0.1 www.example.ru
При попытке получить страничку www.example.ru через IdHTTP, происходит Exception, сообщающий Error resolving host
Если сделать ping www.example.ru, то все в порядке - связь есть.
Получается, что Indy10 использует методы, которые не просматривают файл hosts. Очень странно.
Может кто сталкивался с такой проблемой?
Indy10 и файл hosts
Модератор: Модераторы
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
Вадим писал(а):Получается, что Indy10 использует методы, которые не просматривают файл hosts. Очень странно.
Может кто сталкивался с такой проблемой?
посмотри как он резалвит имя, и поправь на соответсвие. скорее всего он через свой класс напрямую к днс серверу конектится. а его из ифконфиг берет.
Вернулся к решению проблемы и если кому интересно, то поправить можно.
В файле IdStackUnix.pas (Indy) нужно использовать другую процедуру разрешения имен:
А также добавить в блок uses этого файла имя модуля - resolve.
В файле IdStackUnix.pas (Indy) нужно использовать другую процедуру разрешения имен:
Код: Выделить всё
function TIdStackUnix.HostByName(const AHostName: string;
const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION): string;
var
LI4 : array of THostAddr;
LI6 : array of THostAddr6;
LRetVal : Integer;
name: THostResolver;
begin
case AIPVersion of
ID_IPv4 :
begin
// SetLength(LI4,10);
// LRetVal := ResolveName(AHostName,LI4);
// if LRetVal < 1 then begin
// raise EIdResolveError.CreateFmt(RSResolveError,[ahostname,'Error', LRetVal]);
// end;
// Result := NetAddrToStr(LI4[0]);
name := THostResolver.Create(nil);
if name.nameLookup ( AHostName ) = false then
raise EIdResolveError.CreateFmt(RSResolveError,[ahostname,'Error', LRetVal]);
Result := NetAddrToStr(name.HostAddress);
name.Free;
end;
ID_IPv6 :
begin
SetLength(LI6,10);
LRetVal := ResolveName6(AHostName,LI6);
if LRetVal<1 then begin
raise EIdResolveError.CreateFmt(RSResolveError, [ahostname, LRetVal]);
end;
Result := NetAddrToStr6(LI6[0]);
end;
end;
end;
А также добавить в блок uses этого файла имя модуля - resolve.
