2010-02-03 10 views
9

Na komputerze z aktywną kartą bezprzewodową i portem LAN z kablem krosowanym podłączonym do innego komputera z tą samą aplikacją, musimy wysłać UDP multicast przez przewód LAN do drugiego komputera. Korzystając z gniazd C#, Windows wydaje się próbować kierować komunikat przez adapter WLAN za każdym razem.Określanie, w jakim interfejsie sieciowym powinna znajdować się multiemisja UDP .NET

Czy istnieje sposób określenia, jaki interfejs sieciowy ma wysyłać multicast UDP?

+1

znalazłeś rozwiązanie? Mam ten sam problem. Czy artykuł o MSDN rozwiązał Twój problem? – Gobliins

+0

dla mnie to nie było – Gobliins

+0

@Gobliins Nie działało również dla mnie:/Jakieś rozwiązanie? – J4N

Odpowiedz

5

Prawdopodobnie szukasz SocketOptionName.MulticastInterface. Here to artykuł na temat usługi MSDN, który może Ci pomóc.

Poza tym, jeśli zaktualizujesz lokalną tabelę routingu, aby uzyskać dokładny wpis pasujący do adresu multiemisji i wskazujący odpowiedni interfejs, powinien po prostu działać.

10

Podobnie jak dodatek do odpowiedzi Nikolai: problem z KB318911 jest brudną sztuczką, którą użytkownik musi podać koniecznym indeksem adaptera. Patrząc jak pobrać ten indeks adaptera zorientowali się taki przepis:

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)); 
} 

Pełna uwaga na http://windowsasusual.blogspot.ru/2013/01/socket-option-multicast-interface.html

+0

Samotny link jest [uważany za słabą odpowiedź] (http://stackoverflow.com/faq#deletion), ponieważ samo w sobie nie ma znaczenia i ** zasób docelowy nie może być w przyszłości żywy **. [Byłoby lepiej] (http://meta.stackexchange.com/q/8259), aby uwzględnić istotne części odpowiedzi tutaj i podać link do odsyłacza. – j0k

+0

Fxied, wielkie dzięki –

+0

Dzięki; 'adapter.SupportsMulticast' jest przydatny, aby wiedzieć o. UWAGA: 'p.Index' czasami" -1 "dla lokalnej pętli zwrotnej, kiedy powinno być' 1'. i 'p.Index' wyrzuca, jeśli adapter w ogóle nie ma indeksu. –

2

W zależności od tego, co robisz, jest to metoda Win32, które mogą pomóc. Zwróci najlepszy interfejs dla danego adresu IP. Aby otrzymać jedną domyślną (The 0.0.0.0), która jest zwykle to, co chcesz dla multicast, to całkiem proste:

P/Invoke podpis:

[DllImport("iphlpapi.dll", CharSet = CharSet.Auto)] 
private static extern int GetBestInterface(UInt32 DestAddr, out UInt32 BestIfIndex); 

Potem gdzieś indziej:

// 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); 
Powiązane problemy