2010-02-03 11 views
9

Su un computer con una scheda wireless attiva e una porta LAN con un cavo crossover collegato a un'altra macchina che esegue la stessa applicazione, è necessario inviare un UDP multicast sul cavo LAN all'altro computer. Usando C# Sockets, Windows sembra provare a instradare il messaggio tramite l'adattatore WLAN ogni volta.Specifica l'interfaccia di rete a cui un multicast UDP deve connettersi in .NET

C'è un modo per specificare su quale interfaccia di rete inviare un multicast UDP?

+1

hai trovato una soluzione? Ho lo stesso problema. L'articolo su MSDN ha risolto il tuo problema? – Gobliins

+0

per me non è stato – Gobliins

+0

@Gobliins Non ha funzionato anche per me:/Qualche soluzione? – J4N

risposta

5

Probabilmente stai cercando SocketOptionName.MulticastInterface. Here è un articolo su MSDN che potrebbe aiutarti.

Altro che se si aggiorna la tabella di routing locale per avere una voce esatta che corrisponde all'indirizzo multicast e che punta all'interfaccia giusta dovrebbe funzionare.

10

Proprio come addendum alla risposta Nikolai: il problema con KB318911 è un trucco sporco che l'utente deve fornire l'indice dell'adattatore necessario. Mentre si guarda come recuperare questo indice adattatore ho capito come ricetta:

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

nota completa a http://windowsasusual.blogspot.ru/2013/01/socket-option-multicast-interface.html

+0

Lone link è [considerato una risposta scarsa] (http://stackoverflow.com/faq#deletion) since non ha senso da solo e ** la risorsa target non è garantita per essere viva in futuro **. [Sarebbe preferibile] (http://meta.stackexchange.com/q/8259) includere qui le parti essenziali della risposta e fornire il link per riferimento. – j0k

+0

Fxied, grazie mille –

+0

Grazie; 'adapter.SupportsMulticast' è utile sapere. NOTA: 'p.Index' è talvolta' -1' per loopback locale, quando dovrebbe essere '1'. e 'p.Index' genera se l'adattatore non ha alcun indice. –

2

A seconda di quello che stai facendo, c'è un metodo che potrebbe aiutare Win32. Restituirà la migliore interfaccia per un dato indirizzo IP. Per ottenere quello di default (la 0.0.0.0), che di solito è quello che si vuole per il multicast, è abbastanza facile:

P/Invoke firma:

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

Poi da qualche altra parte:

// 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); 
Problemi correlati