Указания на то, что сетевой интерфейс мультикаста UDP должны идти in.NET
на компьютере с активной беспроводной картой и LAN-портом с перекрестным кабелем, подключенным к другой машине, работающей с тем же приложением, нам нужно отправить многоадресную рассылку UDP по проводу LAN на другой компьютер. Используя сокеты C#, Windows, похоже, пытается маршрутизировать сообщение через адаптер WLAN каждый раз.
есть ли способ указать, какой сетевой интерфейс для отправки многоадресной рассылки UDP?
3 ответов
вы, вероятно, ищете SocketOptionName.MulticastInterface
. здесьЭто статья о MSDN, которая может вам помочь.
другое, что если вы обновите локальную таблицу маршрутизации, чтобы иметь точную запись, соответствующую многоадресному адресу и указывающую на правильный интерфейс, она должна просто работать.
Так же, как добавление к Николаю ответ: проблема с KB318911-это грязный трюк, который пользователь должен предоставить необходимый индекс адаптера. Глядя, как получить этот индекс адаптера, я понял такой рецепт:
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in nics)
{
IPInterfaceProperties ip_properties = adapter.GetIPProperties();
if (!adapter.GetIPProperties().MulticastAddresses.Any())
continue; // most of VPN adapters will be skipped
if (!adapter.SupportsMulticast)
continue; // multicast is meaningless for this type of connection
if (OperationalStatus.Up != adapter.OperationalStatus)
continue; // this adapter is off or not connected
IPv4InterfaceProperties p = adapter.GetIPProperties().GetIPv4Properties();
if (null == p)
continue; // IPv4 is not configured on this adapter
// now we have adapter index as p.Index, let put it to socket option
my_sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, (int)IPAddress.HostToNetworkOrder(p.Index));
}
пояснение к http://windowsasusual.blogspot.ru/2013/01/socket-option-multicast-interface.html
в зависимости от того, что вы делаете, есть метод Win32, который может помочь. Он вернет лучший интерфейс для данного IP-адреса. Чтобы получить один по умолчанию (0.0.0.0), который обычно является тем, что вы хотите для многоадресной рассылки, это довольно просто:
P / Invoke подпись:
[DllImport("iphlpapi.dll", CharSet = CharSet.Auto)]
private static extern int GetBestInterface(UInt32 DestAddr, out UInt32 BestIfIndex);
затем где-то еще:
// There could be multiple adapters, get the default one
uint index = 0;
GetBestInterface(0, out index);
var ifaceIndex = (int)index;
var client = new UdpClient();
client.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, (int)IPAddress.HostToNetworkOrder(ifaceIndex));
var localEndpoint = new IPEndPoint(IPAddress.Any, <port>);
client.Client.Bind(localEndpoint);
var multicastAddress = IPAddress.Parse("<group IP>");
var multOpt = new MulticastOption(multicastAddress, ifaceIndex);
client.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, multOpt);
var broadcastEndpoint = new IPEndPoint(IPAddress.Parse("<group IP>"), <port>);
byte[] buffer = ...
await client.SendAsync(buffer, buffer.Length, broadcastEp).ConfigureAwait(false);