Re: WSAAsyncGetHostByName
От: dogonthesun  
Дата: 21.08.12 10:16
Оценка: +1
Здравствуйте, Barkulab, Вы писали:

B>Недавно начал использовать эту функцию для получения IP адресов компьютеров в рабочей локальной сети.

B>В отличие от обычного gethostbyname нет тормозов если компьютер уже выключен, но еще виден в сетевом окружении.
B>Но при каждом запуске увеличивается возвращаемое значение, WSACancelAsyncRequest чето не сбрасывает счетчик.

B>Есть ли возможность обнуления счетчика возвращаемых значений?

B>Нужно чтобы при обновлении списка компьютеров в сети, WSAAsyncGetHostByName начинала нумерацию с 0.

Это все равно что требовать, чтобы pid'ы процессов httpd всегда начинались с 3245 (например). Вообще, никто не обещал, что возвращаемое значение будет увеличиваться. Оно может уменьшаться или возвращать значения из ряда Фибоначчи. Нельзя верить, что они всегда будут расти.

Вы используете возвращаемое значение в качестве индекса массива?
Re[4]: WSAAsyncGetHostByName
От: Barkulab Россия  
Дата: 21.08.12 23:13
Оценка: :)
Здравствуйте, dogonthesun, Вы писали:

D>имхо, следует пересмотреть такое решение в сторону использования более подходящих методов.


Ну подскажи мне, не слишком умному более подходящий метод.
Мой метод такой:
Через NetServerEnum() получаю список компьютеров.
Далее в цикле прогоняю полученный список и узнаю IP адрес каждого компьютера.
Обычный gethostbyname() тупит и тормозит если комп уже выключен но числится в списке.
Так что иногда обновление происходит около 10 секунд.
Через WSAAsyncGetHostByName() обновление происходит почти моментально, даже когда компов не в сети более десятка.
Проблему с индексами массивов я конечно же решил, я просто хочу избежать лишней возни из-за того что каждый вызов WSAAsyncGetHostByName() увеличивает счетчик.

Есть ли возможность сбросить этот счетчик, не закрывая полностью и не запуская заново WinSock???
Re[6]: WSAAsyncGetHostByName
От: Barkulab Россия  
Дата: 22.08.12 14:09
Оценка: -1
Здравствуйте, dogonthesun, Вы писали:

D>HANDLE – не счетчик.


Ну как же не счетчик?
HANDLE возвращаемый WSAAsyncGetHostByName() представляет собой числовой идентификатор.
При каждом успешном вызове идентификатор на 1 больше предыдущего.
Я вызываю WSAAsyncGetHostByName() в одной функции, после ее завершения WindowProc обрабатывает все ее успешные вызовы,
передавая в качестве параметров те же самые идентификаторы (wParam == HANDLE).

При первом запуске все идентификаторы (HANDLE) абсолютно совпадают по номерам со списком компьютеров из NetServerEnum().
При повторном идентификаторы продолжают увеличиваться на 1.
Я нашел способ сброса только полным закрытием WINSOCK --> WSACleanup() и затем повторной инициализацией WSAStartup().
Но это совсем не разумный способ, я ищу способ сброса счетчика не закрывая WINSOCK.

Или же, подскажите как быстро опросить компьютер зная его имя в сети и получить IP адрес.
Мне главное избежать тормозов когда компьютер не в сети.
gethostbyname() тормозит, getaddrinfo()/getnameinfo() тоже.
А WSAAsyncGetHostByName() не тормозит вообще, если комп не в сети просто возвращает ошибку #11001 моментально (несколько милисекунд).
Re[7]: WSAAsyncGetHostByName
От: const_volatile  
Дата: 22.08.12 14:30
Оценка: +1
Здравствуйте, Barkulab, Вы писали:

B>Здравствуйте, dogonthesun, Вы писали:


D>>HANDLE – не счетчик.

B>Ну как же не счетчик?

ты идиот?
WSAAsyncGetHostByName
От: Barkulab Россия  
Дата: 20.08.12 22:50
Оценка:
Недавно начал использовать эту функцию для получения IP адресов компьютеров в рабочей локальной сети.
В отличие от обычного gethostbyname нет тормозов если компьютер уже выключен, но еще виден в сетевом окружении.
Но при каждом запуске увеличивается возвращаемое значение, WSACancelAsyncRequest чето не сбрасывает счетчик.

Есть ли возможность обнуления счетчика возвращаемых значений?
Нужно чтобы при обновлении списка компьютеров в сети, WSAAsyncGetHostByName начинала нумерацию с 0.
Re[2]: WSAAsyncGetHostByName
От: Barkulab Россия  
Дата: 21.08.12 12:21
Оценка:
Здравствуйте, dogonthesun, Вы писали:

D>Вы используете возвращаемое значение в качестве индекса массива?


Ага.
Re[3]: WSAAsyncGetHostByName
От: dogonthesun  
Дата: 21.08.12 13:51
Оценка:
Здравствуйте, Barkulab, Вы писали:

B>Ага.


имхо, следует пересмотреть такое решение в сторону использования более подходящих методов.
Re[5]: WSAAsyncGetHostByName
От: dogonthesun  
Дата: 22.08.12 07:36
Оценка:
Здравствуйте, Barkulab, Вы писали:

B>Есть ли возможность сбросить этот счетчик, не закрывая полностью и не запуская заново WinSock???


HANDLE – не счетчик.
Re[5]: WSAAsyncGetHostByName
От: ononim  
Дата: 22.08.12 11:46
Оценка:
B>Проблему с индексами массивов я конечно же решил, я просто хочу избежать лишней возни из-за того что каждый вызов WSAAsyncGetHostByName() увеличивает счетчик.
Какой нафиг массив, какие нафиг индексы, какая нафиг возня? Тут самое место std::map'у.

B>Есть ли возможность сбросить этот счетчик, не закрывая полностью и не запуская заново WinSock???

Никто не обещал вам там счетчик, никто не обещал вам что он будет инкрементиться с каждым вызовом и ваще возрастать. Вот в следующем апдтейте винды в винсоке чтонить поменяют и будет возвращаться значение рандомное из промежутка (0-0xffffffff) после каждого вызова.
Как много веселых ребят, и все делают велосипед...
Re[7]: WSAAsyncGetHostByName
От: ononim  
Дата: 22.08.12 14:29
Оценка:
B>Ну как же не счетчик?
B>HANDLE возвращаемый WSAAsyncGetHostByName() представляет собой числовой идентификатор.
B>При каждом успешном вызове идентификатор на 1 больше предыдущего.
вот выделенного вам документация не обещает, то что оно сейчас у вас так себя ведет — совсем не значит что оно будет так же работать всегда и везде
Как много веселых ребят, и все делают велосипед...
Re[6]: WSAAsyncGetHostByName
От: Barkulab Россия  
Дата: 23.08.12 03:42
Оценка:
Здравствуйте, ononim, Вы писали:

O> Вот в следующем апдтейте винды в винсоке чтонить поменяют и будет возвращаться значение рандомное из промежутка (0-0xffffffff) после каждого вызова.


Начиная с 98й винды ничего в WSAAsyncGetHostByName() не менялось.
Чего бы в ней меняли раз в 15 лет?
Re[8]: WSAAsyncGetHostByName
От: Barkulab Россия  
Дата: 23.08.12 03:53
Оценка:
Здравствуйте, const_volatile, Вы писали:

B>>Здравствуйте, dogonthesun, Вы писали:


D>>>HANDLE – не счетчик.

B>>Ну как же не счетчик?

_>ты идиот?


Первый успешный вызов WSAAsyncGetHostByName() всегда равен 1.
Все последующие вызовы возвращают значение на 1 больше предыдущего.
Re[9]: WSAAsyncGetHostByName
От: Centaur Россия  
Дата: 23.08.12 05:33
Оценка:
Здравствуйте, Barkulab, Вы писали:

B>Первый успешный вызов WSAAsyncGetHostByName() всегда равен 1.

B>Все последующие вызовы возвращают значение на 1 больше предыдущего.

Покажи цитату из MSDN, где это гарантируется.
Re[10]: WSAAsyncGetHostByName
От: Barkulab Россия  
Дата: 23.08.12 14:07
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Покажи цитату из MSDN, где это гарантируется.


В MSDN про это ничего не написано, но я тестировал на разных машинах и разных ОС.
У меня всегда HANDLE идентификатор после первого успешного вызова равен 1.

Еще так, на всякий случай... пока я использовал эту функцию только при работе по локальной сети.
Вполне возможно если указать в качестве параметра не локальный а удаленный хост [www.microsoft.com],
результат будет не совсем ожидаемым.
Re[11]: WSAAsyncGetHostByName
От: Centaur Россия  
Дата: 24.08.12 04:47
Оценка:
Здравствуйте, Barkulab, Вы писали:

C>>Покажи цитату из MSDN, где это гарантируется.


B>В MSDN про это ничего не написано, но я тестировал на разных машинах и разных ОС.


А, ну я улицы на красный свет тоже перебегал. Много и разных. И жив до сих пор. Но это не значит, что так можно делать.
Re[11]: WSAAsyncGetHostByName
От: acDev Россия  
Дата: 24.08.12 06:29
Оценка:
Здравствуйте, Barkulab, Вы писали:

B>В MSDN про это ничего не написано, но я тестировал на разных машинах и разных ОС.

B>У меня всегда HANDLE идентификатор после первого успешного вызова равен 1.

Погугли про счётчик SockAsyncTaskHandleCounter.
Так же глянь в дизасме модуль ws2_32.dll , в котором ты увидишь, что счётчик этот только инкрементится.

ЗЫ. Для обнуления счётчика можешь вызвать функцию SockAllocateContextBlock много много раз. Но на x64 уж слишком много ))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.