Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Определение текущего сетевого интерфейса, программно  (Прочитано 14066 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
zubr
Гость
« : 13-07-2012 16:20 » 

В общем, задача следующая.
Мне надо получить mac-адрес текущего сетевого интерфейса. Проблема в том, что в системе их может быть несколько. Мне надо как-то имея список интерфейсов выбрать именно тот с которым в данный момент работает приложение. Можно конечно пингануть на какой нибудь эхо-сервер и от него узнать айпишник, а затем сопоставить айпишник с сетевым интерфейсом, но это как-то некошерно. Возможно есть способ все это сделать локально?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 13-07-2012 16:36 » 

Программа route показывает маршруты, как идет траффик. Посмотреть какой интерфейс в данный момент смотрит во внешний мир.
Вот результат работы Linux версии этой программы
Код:
$route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.10.102.1     0.0.0.0         UG    0      0        0 wlan0
10.10.102.0     *               255.255.255.0   U     0      0        0 wlan0

default показывает маршрут на  все адресса. Т.е. остатется только посмотреть на какой интерфейс приходится маршрут по умолчанию.
« Последнее редактирование: 13-07-2012 16:42 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #2 : 13-07-2012 16:36 » 

можно попробовать получить текущий локальный адрес для соединения через getsockname(), а дальше - перебором интерфейсов поискать к кому он относится. это работает только для установленных соединений.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 13-07-2012 16:43 » 

darkelf, Тема не в программировании Улыбаюсь
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 13-07-2012 17:37 » 

Если такое чем-то поможет...

>netsh interface ip show ipaddress index=10.1.0.2

Запись IP-адреса интерфейса MIB-II
    IP-адрес          Маска       Формат   Размер         Интерфейс
---------------  ---------------  ------  --------  -----------------------
10.1.0.2         255.255.255.0         1     65535  eth0

Надо полагать в Win32 API должно что-то быть для аналогичных действий.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #5 : 13-07-2012 18:17 » 

можно попробовать получить текущий локальный адрес для соединения через getsockname(), а дальше - перебором интерфейсов поискать к кому он относится. это работает только для установленных соединений.
Хм..., тогда придется сокеты перехватывать, что не хотелось бы. Приложение через библиотеку WinInet работает.

Добавлено через 1 минуту и 57 секунд:
RXL, так я ж не знаю какой у текущего интерфейса будет айпишник.
« Последнее редактирование: 13-07-2012 18:19 от zubr » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 13-07-2012 18:50 » 

Тот же, что у соединения. Ведь проключенное TCP-соединение имеет фиксированные значения IP и порта для src и dst.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms738543%28v=vs.85%29.aspx

Меня только вот смущает надпись:
Цитата
Applies to: desktop apps only
Майкрософт в своем репертуаре или можно это просто игнорировать?

С другой стороны там же:
Цитата
Requirements

Minimum supported client
   Windows 2000 Professional

Minimum supported server
   Windows 2000 Server
« Последнее редактирование: 13-07-2012 18:53 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 13-07-2012 19:22 » 

RXL, я пару раз это игнорировал - и везло: для services функции работали.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zubr
Гость
« Ответ #8 : 13-07-2012 19:38 » 

RXL, так как мне узнать этот ip, если у меня нет доступа к сокетам, можно конечно хакерскими методами, но это крайний случай.

Ну только если специально сокет открывать.
« Последнее редактирование: 13-07-2012 19:41 от zubr » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 13-07-2012 21:04 » 

Номер процесса известен?

netstat -nao



Что мы вообще знаем и какими инструментами можно оперировать?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #10 : 14-07-2012 04:52 » 

RXL, спасибо, натолкнул на решение. В отладчике покрутил netstat - он юзает апишку GetExtendedTcpTable, ковырнул msdn - оказывается есть для WinXP AllocateAndGetTcpExTableFromStack, а для более поздних систем GetExtendedTcpTable. Там в возвращаемой структуре как раз pid процесса и локальный адрес.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 14-07-2012 06:50 » new

На здоровье! Лишь бы работало стабильно.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines