2017-05-30 3 views
-1

Ich habe ein Produkt direkt an den Ethernet-Port meines Computers angeschlossen, Multicast-Pakete zu 224.224.10.10 und UDP-Port 24588 zu senden. Ich habe meine UDPclient in dem Code unten eingerichtet, und ich fühle mich wie ich es richtig eingerichtet habe, aber ich bekomme immer noch keine Pakete. Ich erhalte immer eine Ausnahme und sage, dass ich auf eine Antwort gewartet habe. Irgendwelche Gedanken oder eklatante Fehler?Empfangen von Multicast-Nachrichten mit UDPClient

Ich habe mir viele Fragen angesehen, bevor ich das gepostet habe, aber ich konnte keine Lösung finden, und ich konnte niemanden finden, der die gleiche Art von Setup hatte wie ich.

public class ReceiverClass 
{ 
    private UdpClient m_UDPClient = null; 
    private Thread m_UDPReceiverThread = null; 
    private bool m_ContinueReceiving = false; 
    private readonly object m_sync = new object(); 
    private const int UDP_PORT = 24588; 

    public ReceiverClass() 
    { 
     m_ContinueReceiving = true; 
     m_UDPClient = new UdpClient(UDP_PORT); 
     m_UDPClient.Client.ReceiveTimeout = 20000; 

     m_UDPReceiverThread = new Thread(ReceiveData) { IsBackground = true }; 
     m_UDPReceiverThread.Start(); 
    } 

    private void ReceiveData() 
    { 
     bool Continue; 
     byte[] ReceiveBuffer; 
     IPEndPoint defaultIP = new IPEndPoint(IPAddress.Any, 0); 

     m_UDPClient.JoinMulticastGroup(IPAddress.Parse("224.224.10.10")); 
     m_UDPClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 

     lock (m_sync) 
     { 
      Continue = m_ContinueReceiving; 
     } 

     while (Continue) 
     { 
      try 
      { 
       ReceiveBuffer = m_UDPClient.Receive(ref defaultIP); 

       if (null != ReceiveBuffer) 
       { 
        // Do stuff with received... 
       } 
      } 
      catch (Exception e) 
      { 
       // ooo eee kill stream 
       Dispose(false); 
       return; 
      } 
      finally 
      { 
       lock (m_sync) 
       { 
        Continue = m_ContinueReceiving; 
       } 
      } 
     } 
    } 
} 

Antwort

0

Was ich am Ende tun, um die Sockets Klasse vorging und Blick auf die Rohpakete und Kommissionierung, was ich brauchte. Ich binde den Socket an meine Lan-Schnittstelle und schnüffle Zeug aus. Ich musste es als Administrator ausführen, um es zur Arbeit zu bringen, aber das ist in Ordnung. Ich ging diesen Weg, weil ich die Pakete in Wireshark sehen konnte, aber sie kamen nicht zu meinem udpclient. Dies war der schnellste Weg, um zu bekommen, was ich wollte.

 Socket ReceiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); 
     EndPoint DefaultIPEndpoint = new IPEndPoint(IPAddress.Parse("10.0.2.0"), 0); 

     ReceiveSocket.ReceiveTimeout = 5000; 
     ReceiveSocket.Bind(DefaultIPEndpoint); 
     ReceiveSocket.IOControl(IOControlCode.ReceiveAll, new byte[4] { 1, 0, 0, 0 }, null); 

     while (true) 
     { 
      byte[] ReceiveBuffer = new byte[512]; 
      int ByteCount = 0; 

      ByteCount = ReceiveSocket.ReceiveFrom(ReceiveBuffer, ref DefaultIPEndpoint); 
      // Handle packets ... 
     } 
0

ich nichts sofort falsch mit Ihrem Code sehen kann, so habe ich keine richtige Antwort für Sie. Allerdings ist hier ein Stück Code, den ich verwende, um UDP-Broadcast-Nachrichten zu erhalten. Hoffentlich wird es für Sie zu arbeiten, oder geben Sie ein paar neue Ideen:

class UdpHandler { 

    public UdpHandler(int portNo) { 
     Thread t = new Thread(ListenThread); 
     t.IsBackground = true; 
     t.Start(portNo); 
    } 

    public void ListenThread(object portNo) { 
     UdpClient client = new UdpClient { ExclusiveAddressUse = false }; 
     IPEndPoint localEp = new IPEndPoint(IPAddress.Any, (int)port); 
     client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     client.ExclusiveAddressUse = false; 
     client.Client.Bind(localEp); 

     while (true) { 
      byte[] data = client.Receive(ref localEp); 
      DataReceived(data); 
     } 
    } 

    private void DataReceived(byte[] rawData) { 
     // Handle the received data 
    } 
} 
+0

Ja, es hat mir nicht geholfen. Es gibt einen Unterschied im Setup zwischen Broadcast und Multicast-Nachrichten, aber ich weiß nicht was. Immer noch fest. Danke für die Hilfe, ich weiß es zu schätzen. – shoyo