Здравствуйте, Barkulab, Вы писали:
B>Недавно начал использовать эту функцию для получения IP адресов компьютеров в рабочей локальной сети. B>В отличие от обычного gethostbyname нет тормозов если компьютер уже выключен, но еще виден в сетевом окружении. B>Но при каждом запуске увеличивается возвращаемое значение, WSACancelAsyncRequest чето не сбрасывает счетчик.
B>Есть ли возможность обнуления счетчика возвращаемых значений? B>Нужно чтобы при обновлении списка компьютеров в сети, WSAAsyncGetHostByName начинала нумерацию с 0.
Это все равно что требовать, чтобы pid'ы процессов httpd всегда начинались с 3245 (например). Вообще, никто не обещал, что возвращаемое значение будет увеличиваться. Оно может уменьшаться или возвращать значения из ряда Фибоначчи. Нельзя верить, что они всегда будут расти.
Вы используете возвращаемое значение в качестве индекса массива?
Здравствуйте, dogonthesun, Вы писали:
D>имхо, следует пересмотреть такое решение в сторону использования более подходящих методов.
Ну подскажи мне, не слишком умному более подходящий метод.
Мой метод такой:
Через NetServerEnum() получаю список компьютеров.
Далее в цикле прогоняю полученный список и узнаю IP адрес каждого компьютера.
Обычный gethostbyname() тупит и тормозит если комп уже выключен но числится в списке.
Так что иногда обновление происходит около 10 секунд.
Через WSAAsyncGetHostByName() обновление происходит почти моментально, даже когда компов не в сети более десятка.
Проблему с индексами массивов я конечно же решил, я просто хочу избежать лишней возни из-за того что каждый вызов WSAAsyncGetHostByName() увеличивает счетчик.
Есть ли возможность сбросить этот счетчик, не закрывая полностью и не запуская заново WinSock???
Здравствуйте, dogonthesun, Вы писали:
D>HANDLE – не счетчик.
Ну как же не счетчик?
HANDLE возвращаемый WSAAsyncGetHostByName() представляет собой числовой идентификатор.
При каждом успешном вызове идентификатор на 1 больше предыдущего.
Я вызываю WSAAsyncGetHostByName() в одной функции, после ее завершения WindowProc обрабатывает все ее успешные вызовы,
передавая в качестве параметров те же самые идентификаторы (wParam == HANDLE).
При первом запуске все идентификаторы (HANDLE) абсолютно совпадают по номерам со списком компьютеров из NetServerEnum().
При повторном идентификаторы продолжают увеличиваться на 1.
Я нашел способ сброса только полным закрытием WINSOCK --> WSACleanup() и затем повторной инициализацией WSAStartup().
Но это совсем не разумный способ, я ищу способ сброса счетчика не закрывая WINSOCK.
Или же, подскажите как быстро опросить компьютер зная его имя в сети и получить IP адрес.
Мне главное избежать тормозов когда компьютер не в сети. gethostbyname() тормозит, getaddrinfo()/getnameinfo() тоже.
А WSAAsyncGetHostByName() не тормозит вообще, если комп не в сети просто возвращает ошибку #11001 моментально (несколько милисекунд).
Недавно начал использовать эту функцию для получения IP адресов компьютеров в рабочей локальной сети.
В отличие от обычного gethostbyname нет тормозов если компьютер уже выключен, но еще виден в сетевом окружении.
Но при каждом запуске увеличивается возвращаемое значение, WSACancelAsyncRequest чето не сбрасывает счетчик.
Есть ли возможность обнуления счетчика возвращаемых значений?
Нужно чтобы при обновлении списка компьютеров в сети, WSAAsyncGetHostByName начинала нумерацию с 0.
B>Проблему с индексами массивов я конечно же решил, я просто хочу избежать лишней возни из-за того что каждый вызов WSAAsyncGetHostByName() увеличивает счетчик.
Какой нафиг массив, какие нафиг индексы, какая нафиг возня? Тут самое место std::map'у.
B>Есть ли возможность сбросить этот счетчик, не закрывая полностью и не запуская заново WinSock???
Никто не обещал вам там счетчик, никто не обещал вам что он будет инкрементиться с каждым вызовом и ваще возрастать. Вот в следующем апдтейте винды в винсоке чтонить поменяют и будет возвращаться значение рандомное из промежутка (0-0xffffffff) после каждого вызова.
Как много веселых ребят, и все делают велосипед...
B>Ну как же не счетчик? B>HANDLE возвращаемый WSAAsyncGetHostByName() представляет собой числовой идентификатор. B>При каждом успешном вызове идентификатор на 1 больше предыдущего.
вот выделенного вам документация не обещает, то что оно сейчас у вас так себя ведет — совсем не значит что оно будет так же работать всегда и везде
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O> Вот в следующем апдтейте винды в винсоке чтонить поменяют и будет возвращаться значение рандомное из промежутка (0-0xffffffff) после каждого вызова.
Начиная с 98й винды ничего в WSAAsyncGetHostByName() не менялось.
Чего бы в ней меняли раз в 15 лет?
Здравствуйте, Barkulab, Вы писали:
B>Первый успешный вызов WSAAsyncGetHostByName() всегда равен 1. B>Все последующие вызовы возвращают значение на 1 больше предыдущего.
Здравствуйте, Centaur, Вы писали:
C>Покажи цитату из MSDN, где это гарантируется.
В MSDN про это ничего не написано, но я тестировал на разных машинах и разных ОС.
У меня всегда HANDLE идентификатор после первого успешного вызова равен 1.
Еще так, на всякий случай... пока я использовал эту функцию только при работе по локальной сети.
Вполне возможно если указать в качестве параметра не локальный а удаленный хост [www.microsoft.com],
результат будет не совсем ожидаемым.
Здравствуйте, Barkulab, Вы писали:
C>>Покажи цитату из MSDN, где это гарантируется.
B>В MSDN про это ничего не написано, но я тестировал на разных машинах и разных ОС.
А, ну я улицы на красный свет тоже перебегал. Много и разных. И жив до сих пор. Но это не значит, что так можно делать.
Здравствуйте, Barkulab, Вы писали:
B>В MSDN про это ничего не написано, но я тестировал на разных машинах и разных ОС. B>У меня всегда HANDLE идентификатор после первого успешного вызова равен 1.
Погугли про счётчик SockAsyncTaskHandleCounter.
Так же глянь в дизасме модуль ws2_32.dll , в котором ты увидишь, что счётчик этот только инкрементится.
ЗЫ. Для обнуления счётчика можешь вызвать функцию SockAllocateContextBlock много много раз. Но на x64 уж слишком много ))