Зависает gethostbyname()

Тема в разделе "WASM.NETWORKS", создана пользователем _DEN_, 4 май 2008.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Пока что толком еще не понятно в чем дело...

    Есть серверное приложение, использующее нон-блокед сокеты. В определенный момент вызов функции gethostbyname с параметром собственного хостнейма приводит к зависанию, функция просто не возвращает управление.

    Я знаю, где она точно зависнет, знаю где она точно не зависнет, но найти, после чего именно она начинает зависать, мне пока что не удалось. Отлаживать неудобно, потому что первый удачный вызов кешируется, и далее функция нормально работает даже там, где зависает, если ее вызвать там в первый раз.

    По каким причинам может зависать gethostbyname? Может быть кто-нибудь уже сталкивался с подобной проблемой?


    Добавлено:

    Проблема проявляется пока что только на одном компе, то есть окружение играет роль и роль важную, потому что на остальных тестерских и девелоперских компах все нормально.

    Совсем забыл :) Приложение работает под виндой, XP SP2 кажется.
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    криво похукана можт..
     
  3. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    Чисто теоретически зависнуть может т.к. есть функция WSAAsyncGetHostByName, а по этому поводу оффициальная документация советует делать отдельный поток. В этом деле оффициальные документы единственный 100% источник (ну не говоря об опечатках). И сторонний софт может вызывать непредвиденные баги.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Freeman

    Всмысле? Имеешь ввиду что это бага какого-нибудь фаервола?


    Osen

    Из стороннего апи используется только OpenSSL...
     
  5. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    _DEN_
    Я о фаерах тоже говорил. Кароче юзай либо WSAAsyncGetHostByName, либо создавай отдельный поток для сетевых взаимодействий.
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Osen

    Дело в том, что без корректного результата gethostbyname дальнейшие действия не имеют смысла :-( Нужно найти, после чего именно она начинает зависать. Сегодня в США выходной (комп где все виснет - там), поэтому пока что остается только гуглить и гадать.
     
  7. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    либо фаера либо какайато гадость засела.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Кстати, если это важно - помимо прочих сетевых устройств, на этом компе есть вайфай.
     
  9. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    _DEN_
    Ну если отладка там затруднена сложно будет найти причину. А виснуть может по любой причине - может DNS-сервер упал и чего-то там не возрвращает, и учитывая что gethostbyname синхронная - т.е. возвращается только тогда когда есть результат вот и имеем висяк.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Osen

    Я на 99,9% уверен что дело во внутреннем состоянии приложения. До определенного момента она работает, после - нет. Пинг и всякие простые приложения, которым приходится резолвить ип по хостнейму работают нормально.

    Скорее всего какие-то проблемы у самого приложения. Какой-то внутренний косяк. Не исключаю что винсокетный баг...
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Значит так.

    Сервис запускает приложение и общается с ним через перенаправленные stdin/stdout. В приложении в одном потоке читается stdin через std::getline(std::cin, ...), в другом делается gethostbyname. Так вот походу они-то друг другу и мешают. Пока getline ждет инпута из std::cin, gethostbyname будет висеть. Как только строка считана, gethostbyname возвращает управление и корректный результат.

    Как это понимать, инспектор?
     
  12. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    _DEN_
    Пока одна гипотеза. В Вижуал Си есть два типа библиотек : второй для мультитред приложений.
    Может тут причина.
     
  13. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    valterg
    начиная с 2005 всё мултитреад
     
  14. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_
    На том компе Windows Defender не стоит случайно?
     
  15. fourty_fourty

    fourty_fourty Андрей

    Публикаций:
    0
    Регистрация:
    23 фев 2008
    Сообщения:
    23
    Адрес:
    Нязепетровск
    _DEN_
    Кстати, столкнулся с той же проблемой!!! Как быть не знаю, но факт, работа встала!