2010-02-18 6 views
7

J'ai besoin de déterminer l'adresse IP d'une machine qui m'a envoyé un paquet de multidiffusion, de sorte que je puisse y répondre par monodiffusion.Comment déterminer l'IP source d'un paquet de multidiffusion en C#?

J'utilise la csharp suivante (.Net 3.5) code pour recevoir les paquets via une connexion de multidiffusion (code a été modifié par souci de brièveté, avec vérification des erreurs et des options non pertinentes supprimées):

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

Et voici le rappel, où je suis en train d'obtenir l'adresse IP source:

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

Je sais la bonne source IP est dans l'en-tête IP, puisque je peux clairement voir quand je renifle le paquet dans Wireshark. Cependant, au lieu d'imprimer l'adresse IP du système émetteur (192.168.3.4), le code ci-dessus imprime l'adresse IP du groupe de multidiffusion auquel je suis abonné (225.2.2.6). Existe-t-il un moyen d'obtenir l'adresse IP source à la place?

Répondre

3

N'est pas votre réponse dans la variable LocalEndPoint, qui est le point de terminaison de la source du paquet, c'est-à-dire le mec à l'autre extrémité. Notez que je renommerais probablement cette variable quelque chose comme "remoteEP", et l'initialiserais à quelque chose de non spécifique pour éviter la confusion.

+0

Oui. Oui, ça l'est. Je viens de le lancer sur un IPEndPoint pour y arriver. Je vous remercie. –

+0

Super; La seule raison pour laquelle je n'étais pas sûr était parce que je n'avais pas travaillé avec des groupes de Multicast avant - quelque chose pour moi à apprendre! – Bill