![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GetIfTable и текущее подключение к инету...
Chlavik © (2004-03-09 18:34:00)Функция GetIfTable возвращает структуру полем которой является масив описания сетевых интерфейсов а как узнать который из них на данный момент используется юзером для того что бы юзать инет... Вообще то мне надо определить скорость подключения к инету ... Помогите please !!!
Chlavik (2004-03-12 18:35:00) [1]ДА я заюзал GetBestInterface( INADDR_ANY, ifindex ) ноормально пашет ... Thank's
Verg (2004-03-11 09:23:00) [2]
> Получается что GetBestInterFace принимает и не верные Ip
> адреса...
Почему ж неверные. Верные.
INADDR_NONE - это $FFFFFFFF, что соответствует виртуальному адресу броадкаста. В MSW этот адрес всегда пропсан в таблице маршрутизации на один из сетевых итф.
На какой из, если их несколько? - я сам до сих пор недоумеваю, но на какой-то одиниз... Из каких соображений выбирается именно такой-то итф., а не другой? Черт их знает...
Про броадкасты - это вообще отдельная "опера".
Кстати, ну так как с GetHostByName('localhost')?
Попробовал? :))
Chlavik (2004-03-11 00:33:00) [3]А внатуре Sorry... Я просто спутал с GetHostByName ( что то в голове заклинило :) ) Так а прикол в том что при дебаге GetBestInterFace(dword(Inet_Addr('LocalHost')),index) в index был тот самый индекс который надо ... Получается что GetBestInterFace принимает и не верные Ip адреса...
Verg (2004-03-10 20:26:00) [4]
> Inet_Addr('LocalHost')) от 'localHost' никогда не ошибётся
> ...
....и всегда выдаст INADDR_NONE
Есть предложение: иди почитай:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/inet_addr_2.asp
Parameters
cp
[in] Null-terminated character string representing a numberexpressed in the Internet standard ".'' (dotted) notation.
Return Values
If no error occurs, inet_addr returns an unsigned long value containing a suitable binary representation of the Internet address given. If the string in the cp parameter does not contain a legitimate Internet address, for example if a portion of an "a.b.c.d" address exceeds 255, then inet_addr returns the value INADDR_NONE.
Chlavik (2004-03-10 18:28:00) [5]А за INADDR_ANY Пасиба .. последнего сообщения еще не было когда я писал ответ ...
Chlavik (2004-03-10 18:25:00) [6]Inet_Addr('LocalHost')) от 'localHost' никогда не ошибётся ...
Так что что она может вернуть INADDR_NONE я и сам знаю... И тот самый BestOfTheBest даже лучше интерфейс я получаю спокойно. А если ты хочеш прикалыватся то щяс не прикольно...
> И если он единственный
pdwBestIfIndex
[out] Pointer to a DWORD variable - а не buffer так что индекс у нас один... Есть предложения ?
Verg (2004-03-10 18:19:00) [7]var ifindex : DWORD;
mib_ifr : TMIB_IFROW;
if GetBestInterface( INADDR_ANY, ifindex ) = NO_ERROR then
begin
// ..... ifindex - индекс интерфейса через который доступен default gateway
FillChar(mib_ifr, sizeof(mib_ifr), 0);
mib_ifr.dwIndex := ifindex;
if GetIfEntry(mib_ifr) = NO_ERROR then
// Вот и все, собсно
Verg (2004-03-10 17:44:00) [8]
> Chlavik © (10.03.04 17:25) [7]
> GetBestInterFace(dword(Inet_Addr('LocalHost')),index) -
> работает . ТЕМА ЗАКРЫТА...
Это такой "сетевой орех" :)
Ты хоть знаешь что нужно подставлять в inet_addr и что она вернет, если подставить не то?
Она вернет FFFFFFFF.
Поздравляю! В результате приведенного кода ты получил BestOfTheBest интерфейс для broadcast ip адреса.
И если он единственный, то конечно же он и будет тем, через который идет обмен с внешним миром.
Задача выполнена :))) А главное - без циклов!
Chlavik (2004-03-10 17:25:00) [9]GetBestInterFace(dword(Inet_Addr('LocalHost')),index) - работает . ТЕМА ЗАКРЫТА...
Chlavik (2004-03-10 15:38:00) [10]
> Нет, так не выйдет. localhost - это 127.0.0.1
А кто сказал что он 127.0.0.1 ??? GetHostByName('LocalHost');
как раз и вернёт мне IP !!! а вот какойто раведомый Ip тожеж надо знать что бы юзать GetBestInterface.. Может ей свой дать оно будет пахать? Просто мне кажется это было бы быстрее всего - без всяких циклов .. ?
Verg (2004-03-10 15:18:00) [11]
> Chlavik © (10.03.04 15:06) [3]
> Может будеть правельным через GetIpAddrTable получить с
> масива MIB_IPADDRROW тот интедкс который ссответвует Ip
> (localHost) ?
Нет, так не выйдет. localhost - это 127.0.0.1
IP адреса назначаются сетевым интерфейсам. Ннтерфейсов может быть несколько, а у них по несколько IP адресов.
Другой способ - это
GetBestInterface
Задаешь ему какой-нибудь ip адрес заведомо из инета, а он тебе прямо ifindex и вернет.
Verg (2004-03-10 15:09:00) [12]
> Chlavik © (10.03.04 14:59) [2]
> Thanks! Но как её юзать перебрать все MIB_IPFORWARDROW
> в масиве и найти тот у которого (dwForwardDest or dwForwardMask)
> =0 ???
Да, именно так.
Chlavik (2004-03-10 15:06:00) [13]Может будеть правельным через GetIpAddrTable получить с масива MIB_IPADDRROW тот интедкс который ссответвует Ip (localHost) ?
Chlavik (2004-03-10 14:59:00) [14]Thanks! Но как её юзать перебрать все MIB_IPFORWARDROW в масиве и найти тот у которого (dwForwardDest or dwForwardMask) =0 ??? Я просто плохо знаю что такое "маршрутизации", etc ... Или мона както по своему Ip оперделить?
Verg (2004-03-09 19:12:00) [15]Вопрос неоднозначный, но в большинстве случаев будет справедливо считать таким интерфейсом тот, через который проходит путь по-умолчани.
Т.о., тебе нобходимо получить таблице маршрутизации
GetIpForwardTable
Найти путь 0.0.0.0 с маской 0.0.0.0 и его dwForwardIfIndex укажет тебе этот интерфейс.