gethostbyname не работает для локального имени хоста после выхода из спящего режима (Vista + 7?)

Просто интересно, заметил ли кто-нибудь еще это:

На некоторых пользовательских компьютерах с нашим программным обеспечением иногда вызов Win32 winsock gethostbyname завершается с ошибкой с кодом 11004.

В качестве аргумента для gethostbyname я передаю результат из gethostname.

Теперь документы говорят, что 11004 — это WSANO_DATA. Ни одно из описаний не кажется уместным (это происходит, если вы передаете адрес IP6, но, как я уже сказал, я передаю имя хоста).

Еще более интересно то, что MSDN предполагает, что эта комбинация (gethostname, за которой следует gethostbyname) никогда не должна давать сбой, даже если нет IP-адреса (в этом случае он просто вернет пустой список IP-адресов). Вот цитата из записи MSDN gethostname:

... гарантируется, что возвращенное имя будет успешно проанализировано gethostbyname и WSAAsyncGetHostByName.

Это всегда происходит только после выхода из спящего режима, в тот короткий период, когда сеть перезагружается, и только в Vista/7 (ну, я видел это только в Vista и 7).

Одна из теорий, которые у меня были, заключалась в том, что это связано с IP6. Возможно, в течение короткого периода сеть сообщает адрес IP6, но не соответствующий адрес IP4 (я почти уверен, что все клиентские машины имеют двойной стек IP, но я могу ошибаться).

Я попытался воспроизвести, отключив сетевую карту (чтобы не использовать IP-адреса), и не смог воспроизвести.

Кто-нибудь видел это раньше?

Любые идеи?

Джон


person John    schedule 28.01.2010    source источник
comment
Я думаю, вы неправильно интерпретируете документацию. 1) В документации gethostname не говорится, что он никогда не выйдет из строя, только то, что в случае успеха его вывод сможет быть анализирован с помощью gethostbyname. 2) Ошибка gethostbyname не означает, что ему не удается разобрать свой ввод (который вы отправляете из gethostname). Возможно, он успешно разбирает ввод, но не может преобразовать имя в адрес.   -  person nobody    schedule 31.03.2010
comment
Я не согласен. Вот что говорит gethostname в MSDN: Примечание. Если локальное имя хоста не настроено, gethostname должен завершиться успешно и вернуть токен имени хоста, который может разрешить gethostbyname или WSAAsyncGetHostByName. Для меня фраза «решить» подразумевает нечто более сильное, чем просто синтаксический анализ.   -  person John    schedule 31.03.2010


Ответы (1)


Я думаю, вас укусил крайний случай.

В конце концов, делать что-то вроде гибернации — это продвинутая вещь — восстановление ПК до его точного состояния и продолжение работы, как будто ничего не произошло. Это все хорошо, но некоторые вещи не сохранились, например, любые сетевые соединения, которые ожидали ответа, и любые серьезно низкоуровневые регистры «вы не можете установить меня только для чтения». ПРОЦЕССОР.

Я предлагаю вам связаться с Microsoft и спросить их, знают ли они об этом. Если это работает для других ОС, они, скорее всего, заинтересуются исправлением для 7/Vista. Просто будьте готовы передать бинарный файл, чтобы они могли тестировать его до бесконечности.

person Stephen Kellett    schedule 31.03.2010
comment
Большое спасибо - у вас есть опыт отправки ошибок в MS? Я всегда думала, что это очень больно... - person John; 31.03.2010
comment
Извините, я не знаю. В своих отношениях с Microsoft я обнаружил, что это непрозрачная организация, с которой очень трудно иметь дело. Не сложно, как в неуклюже, просто сложно, как в MS, кажется, регулярно реорганизовывает команды, и если вы пострадали от этого, жестко. У меня это случилось со мной дважды. Даже в том случае, когда я получил согласие от команды IE на предоставление профилирующего API для IE, команда была расформирована до того, как работа была завершена. Это расстраивает, я желаю вам всего наилучшего, пытаясь установить контакт. Может мой опыт нетипичен? - person Stephen Kellett; 31.03.2010