Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 укажет тебе этот интерфейс.


Наверх

Титульная страница Поиск, карта сайта Написать письмо