アクティブなワイヤレス カードと、同じアプリケーションを実行している別のマシンに接続されたクロスオーバー ケーブルを備えた LAN ポートの両方を備えたコンピュータでは、LAN ワイヤを介して他のコンピュータに UDP マルチキャストを送信する必要があります。C# ソケットを使用すると、Windows は毎回 WLAN アダプタ経由でメッセージをルーティングしようとするようです。
UDP マルチキャストを送信するネットワーク インターフェイスを指定する方法はありますか?
Nikolaiの回答の補遺と同じように、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で完全なメモ
あなたはおそらく を探していSocketOptionName.MulticastInterface
ます。役立つ MSDN の記事を 次に示します。
それ以外の場合は、ローカル ルーティング テーブルを更新して、マルチキャスト アドレスと正確に一致し、正しいインターフェイスを指し示すエントリを持つようにすると、機能するはずです。
何をしているかによって、役立つ可能性のある 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);