Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

GetIfTable и текущее подключение к инету...   Найти похожие ветки 

 
Chlavik ©   (2004-03-09 18:34) [0]

Функция GetIfTable  возвращает структуру полем которой является масив описания сетевых интерфейсов а как узнать который из них на данный момент используется юзером для того что бы юзать инет... Вообще то мне надо определить скорость подключения к инету ... Помогите please !!!


 
Verg ©   (2004-03-09 19:12) [1]

Вопрос неоднозначный, но в большинстве случаев будет справедливо считать таким интерфейсом тот, через который проходит путь по-умолчани.
Т.о., тебе нобходимо получить таблице маршрутизации

GetIpForwardTable

Найти путь 0.0.0.0 с маской 0.0.0.0 и его dwForwardIfIndex укажет тебе этот интерфейс.


 
Chlavik ©   (2004-03-10 14:59) [2]

Thanks!  Но как её юзать перебрать все MIB_IPFORWARDROW в масиве и найти тот у которого (dwForwardDest or dwForwardMask)  =0 ??? Я просто плохо знаю что такое "маршрутизации", etc ...  Или мона както по своему Ip оперделить?


 
Chlavik ©   (2004-03-10 15:06) [3]

Может будеть правельным через GetIpAddrTable получить  с масива MIB_IPADDRROW тот интедкс который ссответвует Ip (localHost) ?


 
Verg ©   (2004-03-10 15:09) [4]


> Chlavik ©   (10.03.04 14:59) [2]
> Thanks!  Но как её юзать перебрать все MIB_IPFORWARDROW
> в масиве и найти тот у которого (dwForwardDest or dwForwardMask)
>  =0 ???


Да, именно так.


 
Verg ©   (2004-03-10 15:18) [5]


> Chlavik ©   (10.03.04 15:06) [3]
> Может будеть правельным через GetIpAddrTable получить  с
> масива MIB_IPADDRROW тот интедкс который ссответвует Ip
> (localHost) ?


Нет, так не выйдет. localhost - это 127.0.0.1
IP адреса назначаются сетевым интерфейсам. Ннтерфейсов может быть несколько, а у них по несколько IP адресов.

Другой способ - это
GetBestInterface

Задаешь ему какой-нибудь ip адрес заведомо из инета, а он тебе прямо ifindex и вернет.


 
Chlavik ©   (2004-03-10 15:38) [6]


> Нет, так не выйдет. localhost - это 127.0.0.1


А кто сказал что он 127.0.0.1 ??? GetHostByName("LocalHost");
как раз и вернёт мне IP !!! а вот какойто раведомый Ip тожеж надо знать что бы юзать GetBestInterface.. Может ей свой дать оно будет пахать?  Просто мне кажется это было бы быстрее всего - без всяких циклов .. ?


 
Chlavik ©   (2004-03-10 17:25) [7]

GetBestInterFace(dword(Inet_Addr("LocalHost")),index) - работает . ТЕМА ЗАКРЫТА...


 
Verg ©   (2004-03-10 17:44) [8]


> Chlavik ©   (10.03.04 17:25) [7]
> GetBestInterFace(dword(Inet_Addr("LocalHost")),index) -
> работает . ТЕМА ЗАКРЫТА...


Это такой "сетевой орех" :)

Ты хоть знаешь что нужно подставлять в inet_addr и что она вернет, если подставить не то?
Она вернет FFFFFFFF.
Поздравляю! В результате приведенного кода ты получил BestOfTheBest интерфейс для broadcast ip адреса.
И если он единственный, то конечно же он и будет тем, через который идет обмен с внешним миром.

Задача выполнена :))) А главное - без циклов!


 
Verg ©   (2004-03-10 18:19) [9]

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
//    Вот и все, собсно


 
Chlavik ©   (2004-03-10 18:25) [10]

Inet_Addr("LocalHost")) от "localHost" никогда не ошибётся ...
Так что что она может вернуть INADDR_NONE я и сам знаю...  И тот самый BestOfTheBest даже лучше интерфейс я получаю спокойно. А если ты хочеш прикалыватся то щяс не прикольно...

> И если он единственный


pdwBestIfIndex
[out] Pointer to a DWORD variable - а не buffer так что индекс у нас один... Есть предложения ?


 
Chlavik ©   (2004-03-10 18:28) [11]

А за  INADDR_ANY Пасиба .. последнего сообщения еще не было когда я писал ответ ...


 
Verg ©   (2004-03-10 20:26) [12]


> 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 number expressed 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-11 00:33) [13]

А внатуре Sorry...  Я просто спутал с GetHostByName ( что то в голове заклинило :) ) Так а прикол в том что при дебаге GetBestInterFace(dword(Inet_Addr("LocalHost")),index) в index был тот самый индекс который надо ... Получается что GetBestInterFace принимает и не верные Ip адреса...


 
Verg ©   (2004-03-11 09:23) [14]


> Получается что GetBestInterFace принимает и не верные Ip
> адреса...


Почему ж неверные. Верные.

INADDR_NONE - это $FFFFFFFF, что соответствует виртуальному адресу броадкаста. В MSW этот адрес всегда пропсан в таблице маршрутизации на один из сетевых итф.
На какой из, если их несколько? - я сам до сих пор недоумеваю, но на какой-то один из... Из каких соображений выбирается именно такой-то итф., а не другой? Черт их знает...

Про броадкасты - это вообще отдельная "опера".

Кстати, ну так как с GetHostByName("localhost")?
Попробовал? :))


 
Chlavik ©   (2004-03-12 18:35) [15]

ДА я заюзал GetBestInterface( INADDR_ANY, ifindex ) ноормально пашет ... Thank"s



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.03 c
14-1082033065
Cerber
2004-04-15 16:44
2004.04.11
спонсоры


4-1075977573
BorH
2004-02-05 13:39
2004.04.11
Запуск приложения из области памяти %)


7-1079698523
headerr
2004-03-19 15:15
2004.04.11
Отключение прокрутки колесом мыши


3-1081848071
Назаров Евгений
2004-04-13 13:21
2004.04.11
Процедура в InterBase


14-1082064425
Asteroid
2004-04-16 01:27
2004.04.11
3D shooter в 96KB. Кто меньше? :)