2010-02-18 16 views
7

necesito para determinar la dirección IP de una máquina que me ha enviado un paquete de multidifusión, de modo que pueda responder a ella a través de unicast.¿Cómo determino la IP de origen de un paquete de multidifusión en C#?

estoy usando el siguiente CSharp (Net 3.5) código para recibir los paquetes a través de una conexión de multidifusión (código ha sido editado por razones de brevedad, la comprobación de errores y opciones irrelevantes eliminado):

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

Y aquí está la devolución de llamada, en el que estoy tratando de obtener la IP de origen:

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

sé la fuente correcta IP se encuentra en la cabecera IP, ya que puedo ver claramente que existe cuando huelo el paquete de Wireshark. Sin embargo, en lugar de imprimir la IP del sistema de envío (192.168.3.4), el código anterior imprime la IP del grupo de multidifusión al que estoy suscrito (225.2.2.6). ¿Hay alguna manera de obtener la IP de origen en su lugar?

Respuesta

3

no es su respuesta en la variable LocalEndPoint, que es el punto final de la fuente del paquete, es decir, el amigo en el otro extremo. Tenga en cuenta que probablemente cambie el nombre de esta variable algo así como "remoteEP", y lo inicialice en algo no específico para evitar confusiones.

+0

Sí. Sí lo es. Solo tuve que convertirlo en un IPEndPoint para obtenerlo. Gracias. –

+0

Genial; la única razón por la que no estaba seguro era porque nunca antes había trabajado con grupos de multidifusión, ¡algo de lo que podía aprender! – Bill

Cuestiones relacionadas