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?
Oui. Oui, ça l'est. Je viens de le lancer sur un IPEndPoint pour y arriver. Je vous remercie. –
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