2009-04-20 11 views
9

Sto cercando di ottenere alcune semplici comunicazioni UDP che funzionano sulla mia rete locale.Come fare un multicast UDP attraverso la rete locale in C#?

Tutto quello che voglio fare è fare un multicast a tutte le macchine sulla rete

Ecco il mio invio di codice

public void SendMessage(string message) 
    { 
     var data = Encoding.Default.GetBytes(message); 
     using (var udpClient = new UdpClient(AddressFamily.InterNetwork)) 
     { 
      var address = IPAddress.Parse("224.100.0.1"); 
      var ipEndPoint = new IPEndPoint(address, 8088); 
      udpClient.JoinMulticastGroup(address); 
      udpClient.Send(data, data.Length, ipEndPoint); 
      udpClient.Close(); 
     } 
    } 

e qui è il mio codice di ricezione

public void Start() 
    { 
     udpClient = new UdpClient(8088); 
     udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50); 

     receiveThread = new Thread(Receive); 
     receiveThread.Start(); 
    } 

    public void Receive() 
    { 
     while (true) 
     { 
      var ipEndPoint = new IPEndPoint(IPAddress.Any, 0); 
      var data = udpClient.Receive(ref ipEndPoint); 

      Message = Encoding.Default.GetString(data); 

      // Raise the AfterReceive event 
      if (AfterReceive != null) 
      { 
       AfterReceive(this, new EventArgs()); 
      } 
     } 
    } 

Funziona perfettamente sulla mia macchina locale ma non attraverso la rete.

-Non sembra essere il firewall. L'ho disabilitato su entrambe le macchine e ancora non ha funzionato.

-Si funziona se invio direttamente all'indirizzo IP codificato della macchina client (ovvero non multicast).

Qualsiasi aiuto sarebbe apprezzato.

risposta

7

L'hardware di rete locale supporta IGMP?

È possibile che lo switch sia multicast, ma se IGMP è disabilitato non si noterà se un hardware collegato si abbona a un particolare gruppo multicast in modo da non inoltrare tali pacchetti.

Per verificare ciò, collegare temporaneamente due macchine direttamente con un cavo incrociato. Questo dovrebbe (AFAICR) funzionare sempre.

Inoltre, dovrebbe essere il server metà del codice che ha l'argomento TTL fornito a JoinMulticastGroup(), non la metà del client.

0

Impossibile vedere uno TTL specificato in un punto qualsiasi del codice. Ricorda che il TTL era originariamente pensato per essere in unità di secondi, ma è diventato luppolo unitario. Ciò significa che utilizzando un TTL intelligente è possibile eliminare il passaggio attraverso il router. Il TTL predefinito sulla mia macchina è 32 - penso che dovrebbe essere più che adeguato; ma il tuo potrebbe essere effettivamente diverso (UdpClient.Ttl) se il tuo sistema ha attraversato qualsiasi forma di blocco di sicurezza.

Non posso raccomandare il TTL di cui avete bisogno, poiché personalmente ho bisogno di fare molte sperimentazioni.

Se questo non dovesse funzionare, si potrebbe avere uno sguardo a questi articoli:

All-in-tutto sembra che non v'è stata con successo usando Socket e non UdpClients.

Il gruppo multicast scelto potrebbe anche essere solo locale. Try another one.

Anche il livello di rete fisica potrebbe causare problemi. Mi azzarderei a interrogare interruttori e connessioni dirette (x-over). Hub e tutti i più intelligenti dovrebbero gestirli bene. Non ho alcuna letteratura a sostegno di ciò, comunque.

1

Ho appena trascorso 4 ore in qualcosa di simile (credo), la soluzione per me è stato:

client.Client.Bind(new IPEndPoint(IPAddress.Any, SSDP_PORT)); 
client.JoinMulticastGroup(SSDP_IP,IP.ExternalIPAddresses.First()); 
client.MulticastLoopback = true; 

utilizzando uno specifico (prima esterno) indirizzo IP sul gruppo multicast.

+0

Ho avuto problemi a farlo funzionare anche su LAN. Senza il secondo argomento di un indirizzo IP esplicito da ascoltare quando si chiama JoinMulticastGroup(), è stato arbitrariamente scelto un driver ethernet virtuale che avevo installato come parte di Docker/Hyper-V e che si collegava al gruppo multicast invece della mia vera ethernet adattatore. Se si dispone di più di una scheda di rete, è necessario specificare l'indirizzo IP per unirsi esplicitamente al gruppo multicast con l'overload del metodo che accetta un indirizzo IP come secondo argomento. – MEverett