Пока что толком еще не понятно в чем дело... Есть серверное приложение, использующее нон-блокед сокеты. В определенный момент вызов функции gethostbyname с параметром собственного хостнейма приводит к зависанию, функция просто не возвращает управление. Я знаю, где она точно зависнет, знаю где она точно не зависнет, но найти, после чего именно она начинает зависать, мне пока что не удалось. Отлаживать неудобно, потому что первый удачный вызов кешируется, и далее функция нормально работает даже там, где зависает, если ее вызвать там в первый раз. По каким причинам может зависать gethostbyname? Может быть кто-нибудь уже сталкивался с подобной проблемой? Добавлено: Проблема проявляется пока что только на одном компе, то есть окружение играет роль и роль важную, потому что на остальных тестерских и девелоперских компах все нормально. Совсем забыл Приложение работает под виндой, XP SP2 кажется.
Чисто теоретически зависнуть может т.к. есть функция WSAAsyncGetHostByName, а по этому поводу оффициальная документация советует делать отдельный поток. В этом деле оффициальные документы единственный 100% источник (ну не говоря об опечатках). И сторонний софт может вызывать непредвиденные баги.
Freeman Всмысле? Имеешь ввиду что это бага какого-нибудь фаервола? Osen Из стороннего апи используется только OpenSSL...
_DEN_ Я о фаерах тоже говорил. Кароче юзай либо WSAAsyncGetHostByName, либо создавай отдельный поток для сетевых взаимодействий.
Osen Дело в том, что без корректного результата gethostbyname дальнейшие действия не имеют смысла :-( Нужно найти, после чего именно она начинает зависать. Сегодня в США выходной (комп где все виснет - там), поэтому пока что остается только гуглить и гадать.
_DEN_ Ну если отладка там затруднена сложно будет найти причину. А виснуть может по любой причине - может DNS-сервер упал и чего-то там не возрвращает, и учитывая что gethostbyname синхронная - т.е. возвращается только тогда когда есть результат вот и имеем висяк.
Osen Я на 99,9% уверен что дело во внутреннем состоянии приложения. До определенного момента она работает, после - нет. Пинг и всякие простые приложения, которым приходится резолвить ип по хостнейму работают нормально. Скорее всего какие-то проблемы у самого приложения. Какой-то внутренний косяк. Не исключаю что винсокетный баг...
Значит так. Сервис запускает приложение и общается с ним через перенаправленные stdin/stdout. В приложении в одном потоке читается stdin через std::getline(std::cin, ...), в другом делается gethostbyname. Так вот походу они-то друг другу и мешают. Пока getline ждет инпута из std::cin, gethostbyname будет висеть. Как только строка считана, gethostbyname возвращает управление и корректный результат. Как это понимать, инспектор?
_DEN_ Пока одна гипотеза. В Вижуал Си есть два типа библиотек : второй для мультитред приложений. Может тут причина.