2010-02-18 6 views
7

Ich muss die IP eines Computers ermitteln, der mir ein Multicast-Paket gesendet hat, damit ich über Unicast darauf antworten kann.Wie kann ich die Quell-IP eines Multicast-Pakets in C# ermitteln?

ich die folgende csharp (.NET 3.5) Code unter Verwendung der Pakete über eine Multicast-Verbindung (Code bearbeitet wurde der Kürze halber mit Fehlerprüfung und irrelevant Optionen entfernt) zu erhalten:

IPEndPoint LocalHostIPEnd = new IPEndPoint(IPAddress.Any, 8623); 
Socket UDPSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); 
UDPSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, 1); 

UDPSocket.Bind(LocalHostIPEnd); 

//Join the multicast group 
UDPSocket.SetSocketOption(
    SocketOptionLevel.IP, 
    SocketOptionName.AddMembership, 
    new MulticastOption(IPAddress.Parse("225.2.2.6"))); 

IPEndPoint LocalIPEndPoint = new IPEndPoint(IPAddress.Any ,Target_Port); 
EndPoint LocalEndPoint = (EndPoint)LocalIPEndPoint; 

// Create the state object. 
StateObject state = new StateObject(); 
state.buffer.Initialize(); 
state.workSocket = UDPSocket; 
state.id = "state0"; 
//Set up my callback 
UDPSocket.BeginReceiveMessageFrom(
    state.buffer, 
    0, 
    StateObject.BufferSize, 
    0, 
    ref LocalEndPoint, 
    new AsyncCallback(ReceiveCallback), 
    state); 

Und hier ist der Rückruf, wo ich versuche, die Quell-IP zu erhalten:

private void ReceiveCallback(IAsyncResult ar) 
{ 
    IPEndPoint LocalIPEndPoint = new IPEndPoint(IPAddress.Any, Target_Port); 
    EndPoint LocalEndPoint = (EndPoint)LocalIPEndPoint; 

    // Read data from the remote device. 
    // The following code attempts to determine the IP of the sender, 
    // but instead gets the IP of the multicast group. 
    SocketFlags sFlags = new SocketFlags(); 
    IPPacketInformation ipInf = new IPPacketInformation(); 

    int bytesRead = client.EndReceiveMessageFrom(ar, ref sFlags, 
     ref LocalEndPoint, out ipInf); 

    log.Warn("Got address: " + ipInf.Address.ToString()); 
} 

ich weiß, die richtige Quelle IP im IP-Header ist, da ich es klar dort sehen kann, wenn ich das Paket in wireshark schnuppern. Anstatt jedoch die IP des sendenden Systems (192.168.3.4) auszudrucken, druckt der obige Code die IP der Multicast-Gruppe, die ich abonniert habe (225.2.2.6). Gibt es eine Möglichkeit, stattdessen die Quell-IP zu erhalten?

Antwort

3

Ist nicht Ihre Antwort in der Variable LocalEndPoint, die der EndPoint der Quelle des Pakets ist, also der Typ am anderen Ende. Beachten Sie, dass ich diese Variable wahrscheinlich wie "remoteEP" umbenennen würde und sie zu etwas Unspezifischem initialisieren würde, um Verwirrung zu vermeiden.

+0

Ja. Ja, so ist es. Ich musste es nur auf einen IPEndPoint werfen, um daran zu kommen. Vielen Dank. –

+0

Großartig; Der einzige Grund, warum ich mir nicht sicher war, war, dass ich vorher nicht mit Multicast-Gruppen gearbeitet hatte - etwas, über das ich etwas lernen konnte! – Bill

Verwandte Themen