Pregunta

Hace poco he creado una clase para hacer frente a mis programas de redes LAN. Recientemente he actualizado uno de mis ordenadores portátiles de Windows 7 y relized que Windows 7 (o al menos de la manera que tengo configurado) sólo es compatible con IPv6, pero mi escritorio todavía está de vuelta en los días de Windows XP, y sólo utiliza IPv4. La clase creé utiliza la clase UdpClient, y se pone actualmente a sólo el trabajo con IPv4 .. ¿Hay una manera de modificar mi código para permitir el envío y recepción de paquetes IPv6 e IPv4 ?? Sería difícil de desechar el código de clases, muchos de mis programas se basan en esta clase. Me gustaría mantener a la clase lo más cercano a su estado original, por lo que no tenga que modificar mis programas más antiguos, sólo el interruptor de la clase de edad para el actualizado.

Gracias por cualquier y toda la ayuda, Max

Enviar:

    using System.Net.Sockets;UdpClient tub = new UdpClient ();
    tub.Connect ( new IPEndPoint ( ToIP, ToPort ) );
    UdpState s = new UdpState ();
    s.client = tub;
    s.endpoint = new IPEndPoint ( ToIP, ToPort );

    tub.BeginSend ( data, data.Length, new AsyncCallback ( SendCallBack ),s);

    private void SendCallBack ( IAsyncResult result )
    {
        UdpClient client = (UdpClient)( (UdpState)( result.AsyncState ) ).client;
        IPEndPoint endpoint = (IPEndPoint)( (UdpState)( result.AsyncState ) ).endpoint;
        client.EndSend ( result );
    }

Recibir:

    UdpClient tub = new UdpClient (ReceivePort);

    UdpState s = new UdpState ();
    s.client = tub;
    s.endpoint = new IPEndPoint ( ReceiveIP, ReceivePort );
    s.callback = cb;
    tub.BeginReceive ( new AsyncCallback ( receivedPacket ), s );

    public void receivedPacket (IAsyncResult result)
    {
        UdpClient client = (UdpClient)( (UdpState)( result.AsyncState ) ).client;
        IPEndPoint endpoint = (IPEndPoint)( (UdpState)( result.AsyncState ) ).endpoint;
        Byte[] receiveBytes = client.EndReceive ( result, ref endpoint );
        Packet ThePacket = new Packet ( receiveBytes );
        client.Close();
        //Do what ever with the 'ThePacket' now
    }
¿Fue útil?

Solución

Otros consejos

UdpClient se puede preparar para recibir en IPv4 e IPv6, proporcionando un zócalo DualMode:

socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);
socket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234));
var udpClient = new UdpClient();
udpClient.Client = socket;
... (use udpClient)

El envío es más fácil, podemos crear UdpClient con la dirección de destino especificada (IPv4 o IPv6). AddressFamily se puede proporcionar en el constructor, si es necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top