C#: Socket и NetworkInterface
Есть клиент-серверное приложение. Клиент должен послать серверу свой мак, но именно той карты, через которую происходит соединение.
Сокет у клиента такого типа:
Код:
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;
}
{
string result = null;
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in nics)
{
result += adapter.GetPhysicalAddress().ToString() + "\r\n";
}
return result;
}
Метод в этом виде вернет все маки. Но как у sender'a можно узнать, какую именно карту он использует?
Цитата: LLIbIcpEP
Доброго времени суток.
Есть клиент-серверное приложение. Клиент должен послать серверу свой мак, но именно той карты, через которую происходит соединение.
Есть клиент-серверное приложение. Клиент должен послать серверу свой мак, но именно той карты, через которую происходит соединение.
Вообще-то MAC-адрес сетевого адаптера в Ethernet передается всегда (в заголовке кадра). Другое дело, что совсем не понятно как добраться до этого заголовка из .NET на стороне сервера. Вообще есть функция SendARP в библиотеке Iphlpapi.dll для разрешения IP адресов.
Код:
DWORD SendARP(
__in IPAddr DestIP,
__in IPAddr SrcIP,
__out PULONG pMacAddr,
__in_out PULONG PhyAddrLen
);
__in IPAddr DestIP,
__in IPAddr SrcIP,
__out PULONG pMacAddr,
__in_out PULONG PhyAddrLen
);
А по поводу кода.... хмм что-то не нашел вот так сходу как добраться до IP адреса сетевого интерфейса.
А предложенный Вами вариант не применим, т.к. он действенен только в своей сети, если я не ошибаюсь.. Ведь иначе сервер будет вычислять мак роутера\шлюза\etc..
Код:
string result = null;
ManagementObjectSearcher searcherq = new ManagementObjectSearcher("Select MACAddress from Win32_NetworkAdapter");
foreach (ManagementObject hardware in searcherq.Get())
{
result += hardware.GetPropertyValue("MACAddress") + "\r\n";
}
ManagementObjectSearcher searcherq = new ManagementObjectSearcher("Select MACAddress from Win32_NetworkAdapter");
foreach (ManagementObject hardware in searcherq.Get())
{
result += hardware.GetPropertyValue("MACAddress") + "\r\n";
}
Но вопрос все тот-же, как из всех маков, выбрать один единственный?..
Код:
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;
}
{
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;
}
Код:
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;
}
{
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;
}