Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C#: Socket и NetworkInterface

32K
25 февраля 2009 года
LLIbIcpEP
32 / / 06.07.2008
Доброго времени суток.
Есть клиент-серверное приложение. Клиент должен послать серверу свой мак, но именно той карты, через которую происходит соединение.
Сокет у клиента такого типа:
 
Код:
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

скажем, я могу передать его в метод, вычисляющий мак:
 
Код:
static string Mac(Socket sender)
        {
            string result = null;
            NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
            foreach (NetworkInterface adapter in nics)
            {
                result += adapter.GetPhysicalAddress().ToString() + "\r\n";
            }
            return result;
        }

Метод в этом виде вернет все маки. Но как у sender'a можно узнать, какую именно карту он использует?
5
25 февраля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: LLIbIcpEP
Доброго времени суток.
Есть клиент-серверное приложение. Клиент должен послать серверу свой мак, но именно той карты, через которую происходит соединение.

Вообще-то MAC-адрес сетевого адаптера в Ethernet передается всегда (в заголовке кадра). Другое дело, что совсем не понятно как добраться до этого заголовка из .NET на стороне сервера. Вообще есть функция SendARP в библиотеке Iphlpapi.dll для разрешения IP адресов.

 
Код:
DWORD SendARP(
  __in          IPAddr DestIP,
  __in          IPAddr SrcIP,
  __out         PULONG pMacAddr,
  __in_out      PULONG PhyAddrLen
);


А по поводу кода.... хмм что-то не нашел вот так сходу как добраться до IP адреса сетевого интерфейса.
32K
25 февраля 2009 года
LLIbIcpEP
32 / / 06.07.2008
hardcase, Вы не поняли. Мак должен узнать клиент, свой собственный, и отправить его на сервер своими средствами. Вопрос лишь в том, как быть, если на машине несколько сетевых устройств. Для этого нужно определить то, с которого будут передаваться данные.
А предложенный Вами вариант не применим, т.к. он действенен только в своей сети, если я не ошибаюсь.. Ведь иначе сервер будет вычислять мак роутера\шлюза\etc..
32K
25 февраля 2009 года
LLIbIcpEP
32 / / 06.07.2008
еще через WMI пробовал:
 
Код:
string result = null;
            ManagementObjectSearcher searcherq = new ManagementObjectSearcher("Select MACAddress from Win32_NetworkAdapter");
            foreach (ManagementObject hardware in searcherq.Get())
            {
                result += hardware.GetPropertyValue("MACAddress") + "\r\n";
            }

Но вопрос все тот-же, как из всех маков, выбрать один единственный?..
3
26 февраля 2009 года
Green
4.8K / / 20.01.2000
Ну уж на сколько я не знаю .NET, но решение проблемы с помощью одного только MSDN заняло несколько минут:
Код:
static string Mac(Socket sender)
    {
        IPAddress addr = ((IPEndPoint)sender.LocalEndPoint).Address;

        NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
        foreach (NetworkInterface adapter in nics)
        {
            foreach (IPAddressInformation info in adapter.GetIPProperties().UnicastAddresses)
            {
                if (addr.Equals(info.Address))
                {
                    return adapter.GetPhysicalAddress().ToString();
                }
            }
        }

        return null;
    }
32K
04 марта 2009 года
LLIbIcpEP
32 / / 06.07.2008
Спасибо, сейчас у меня исправно работает такой код:
Код:
public static string Mac(Socket sender)
        {
            string result = null;
            IPAddress addr = ((IPEndPoint)sender.RemoteEndPoint).Address;
            NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
            foreach (NetworkInterface adapter in nics)
            {
                foreach (IPAddressInformation info in adapter.GetIPProperties().UnicastAddresses)
                {
                    string tmp = null;
                    tmp += adapter.GetPhysicalAddress();
                    if (tmp.Trim() != "")
                        result = tmp;
                }
            }
            return result;
        }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог