Indy10 и файл hosts

Модератор: Модераторы

Indy10 и файл hosts

Сообщение Вадим » 06.08.2008 21:17:47

Делаю простую программу для linux.
На компьютере, в файле hosts, прописано соответствие типа 127.0.0.1 www.example.ru
При попытке получить страничку www.example.ru через IdHTTP, происходит Exception, сообщающий Error resolving host
Если сделать ping www.example.ru, то все в порядке - связь есть.

Получается, что Indy10 использует методы, которые не просматривают файл hosts. Очень странно.
Может кто сталкивался с такой проблемой?
Вадим
новенький
 
Сообщения: 24
Зарегистрирован: 15.04.2007 12:12:26
Откуда: город-герой Волгоград

Re: Indy10 и файл hosts

Сообщение Attid » 07.08.2008 13:52:17

Вадим писал(а):Получается, что Indy10 использует методы, которые не просматривают файл hosts. Очень странно.
Может кто сталкивался с такой проблемой?

посмотри как он резалвит имя, и поправь на соответсвие. скорее всего он через свой класс напрямую к днс серверу конектится. а его из ифконфиг берет.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Indy10 и файл hosts

Сообщение Вадим » 09.07.2009 22:49:51

Вернулся к решению проблемы и если кому интересно, то поправить можно.
В файле 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.
Вадим
новенький
 
Сообщения: 24
Зарегистрирован: 15.04.2007 12:12:26
Откуда: город-герой Волгоград


Вернуться в Сети

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru