"Если вдруг открылся люк, не пугайся, это глюк!" (с) Если что-то работает не так, вы нашли ошибку или опечатку в программе — вам в этот раздел
derwin
Суть проблемы в том, что мычат просмотре профиля юзера отображает не его реальный сетевой адрес, а мак адрес первого в системе сетевого адаптера. Чаще всего это какие нибудь wifi модули, либо какие сетевые адаптеры, назначение которых мне не понятно (ноутбуки Lenovo, только с ними такие проблемы)
Версия 5,14,1 - но я не думаю что обновление поможет, в анонсах не видел фикс такой проблемы.
Аватара пользователя
Алексей Пикуров
День добрый.

Окей, а какой MAC адрес возвращать? Как это определить? Программа определяет все доступные, и возвращает первый попавшийся, так и есть.
derwin
ну как минимум IP адрес определяется правильно!
Значит парсим список интерфейсов, смотрим где этот адрес, выводим мак.
derwin
а есть ещё туннельный адреса, мультикастовые адреса, их бы можно исключить. Тот же локалхост.
Аватара пользователя
Алексей Пикуров
Значит парсим список интерфейсов, смотрим где этот адрес, выводим мак.

Такой вариант не сработает.

На самом деле, всё намного сложнее. Сервер показывает IP адрес клиента, откуда происходит подключение. Если клиенты за шлюзом или за NAT — у всех этот адрес будет одинаковым. То есть, он не будет = локальному IP адресу клиента, который может его определить и сопоставить со своим локальным MAC.

Я не знаю надёжного способа определить, через какой сетевой интерфейс клиент подключился к серверу. Учитывая то, что точек подключения может быть сразу несколько. Сейчас трафик идёт через один интерфейс, а через секунду — может идти через другой.
Аватара пользователя
Алексей Пикуров
а есть ещё туннельный адреса, мультикастовые адреса, их бы можно исключить. Тот же локалхост.

localhost и так не учитывается, какой смысл передавать 127.0.0.1? Где вы его увидели?

Мультикаст мы не используем.
туннельный адреса

Поясните, не понял.
Аватара пользователя
Алексей Пикуров
Можно сделать так.

Клиент, после того, как подключится к серверу, узнаёт, какой IP адрес у него со стороны сервера и сопоставляет свой MAC из списка полученных, с тем IP, который ему сообщил сервер.

Если есть совпадение (это будет только в локальной одноранговой сети), то он будет возвращать именно этот адрес. Если нет — будет работать старая схема.
derwin
Сейчас трафик идёт через один интерфейс, а через секунду — может идти через другой.

Алексей, давайте пожалуйста не будем брать в расчёт сферических коней в вакууме.

Согласны, что первый в списке адаптер малоинформативен в корпоративных целях? то, я бы по маку нашёл где в какой коммутатор подключен абонент, а сейчас - трачу время на выяснение его реального мака.
Логично предположить, что наиболее информативнее будет видеть мак устройства, через которое осуществляется выход в сети?
Делается всё очень просто. Нужно найти адаптер:
1) тип Ethernet
2) у него есть IP
3) у него есть основной шлюз. У устройства будет только 1 основной шлюз (gateway). Если это не так - значит кого то в детстве роняли (простите за сарказм).
4) если всё совпадает - значит это наш искомый МАК.

Если меняется источник сети - значит меняется основной шлюз. Значит можно пробежаться, выяснить новый активный адаптер.

Туннельные адреса это мак-адреса в рамках туннеля PPPoE или подобных. Конкретно для PPPoE он идёт вида ff:ff:ff**** - всё это можно не фильтровать, если на ранней стадии отсеивать по признаку "ethernet adapter".
derwin
этот механизм включать, если сеть абонента не укладывается в маску сетки у сервера (гуглим "Wildcard маски", сети могут быть /20 /30 и т.п.)
Аватара пользователя
Алексей Пикуров
Идея интересная, попробуем что-то придумать.
Аватара пользователя
Алексей Пикуров
Реализовано, спасибо за предложения. Будет в будущей версии.

viewtopic.php?p=25016#p25016
derwin
проверка на тип эзернет есть? а то опять будем ловить всякие левые адаптеры и туннели.
туннель - имеет IP , шлюз, есть принято/отправлено
Аватара пользователя
Алексей Пикуров
Привязываться только к Ethernet -адаптерам нельзя. Есть ещё wi-fi, к примеру. Не все клиенты подключаются по витой паре. Обновитесь, попробуете.
derwin
wifi вообще то тоже тип эзернет. Проверьте, убедитесь
Код: Выделить всё
https://msdn.microsoft.com/ru-ru/library/system.net.networkinformation.networkinterface.networkinterfacetype(v=vs.110).aspx
Аватара пользователя
Алексей Пикуров
Мы не используем .Net.

Обновитесь, потом скажете, корректно у вас работает или нет.
derwin
алексей, я вам дал намёк на список типов интерфейсов, которые существуют в винде. Смотрите глубже, итак всё на блюдечке ))

Это WinAPI

Код: Выделить всё
https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa365917(v=vs.85).aspx