Указания на то, что сетевой интерфейс мультикаста 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);