2 Stimmen

Wie man einer quellenspezifischen Multicast-Gruppe in C# beitritt (IGMPv3)

Wir haben eine C#-Anwendung, die einer Multicast-Gruppe beitreten und Daten von ihr empfangen kann. Das funktioniert gut. Jetzt möchten wir IGMPv3 unterstützen und in der Lage sein, die IP der Quelle beim Beitritt zu einer Multicast-Gruppe anzugeben. Aus der MSDN-Dokumentation geht nicht hervor, wie man dies tun kann. Ich habe den folgenden Link gefunden, der meine Frage zu beantworten scheint.

http://social.msdn.microsoft.com/Forums/en/netfxnetcom/thread/e8063f6d-22f5-445e-a00c-bf46b46c1561

Und hier ist, wie ich das umgesetzt habe:

byte[] membershipAddresses = new byte[12]; // 3 IPs * 4 bytes (IPv4)
Buffer.BlockCopy(multicastIp.GetAddressBytes(), 0, membershipAddresses, 0, 4);
Buffer.BlockCopy(sourceIp.GetAddressBytes(), 0, membershipAddresses, 4, 4);
Buffer.BlockCopy(localIp.GetAddressBytes(), 0, membershipAddresses, 8, 4);
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, membershipAddresses);

Aber ich erhalte eine SocketException beim Aufruf von SetSocketOption() mit diesem Fehler: The requested address is not valid in its context .

Kann mir jemand sagen, was ich hier falsch mache? Danke!

5voto

Steve-o Punkte 12493

Der Link besagt SocketOptionName.AddSourceMembership verwenden Sie AddMembership .

1voto

Für alle, die Probleme mit Quell-Multicast haben

static void StartListner(IPAddress sourceIp, IPAddress multicastGroupIp, IPAddress localIp, int port)
{
    Task.Run(() =>
    {
        try
        {
            Console.WriteLine("Starting: "  + sourceIp + " - " + multicastGroupIp + " - " + localIp + " / " + port);

            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            IPEndPoint localEndpoint = new IPEndPoint(localIp, port);
            socket.Bind(localEndpoint);

            byte[] membershipAddresses = new byte[12]; // 3 IPs * 4 bytes (IPv4)
            Buffer.BlockCopy(multicastGroupIp.GetAddressBytes(), 0, membershipAddresses, 0, 4);
            Buffer.BlockCopy(sourceIp.GetAddressBytes(), 0, membershipAddresses, 4, 4);
            Buffer.BlockCopy(localIp.GetAddressBytes(), 0, membershipAddresses, 8, 4);
            socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddSourceMembership, membershipAddresses);

            while (true)
            {
                byte[] b = new byte[1024];
                int length = socket.Receive(b);

                Console.WriteLine("PORT: " + port + " : " + Encoding.ASCII.GetString(b, 0, length));
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    });
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X