Domanda

Un po 'di tempo fa ho creato una classe a che fare con i miei programmi di rete LAN. Recentemente ho aggiornato uno dei miei computer portatili a Windows 7 e relized che Windows 7 (o almeno il modo in cui l'ho impostato su) supporta solo IPv6, ma il mio desktop è ancora indietro nei Windows XP giorni, e utilizza solo IPv4. La classe ho creato utilizza la classe classe UdpClient, ed è attualmente configurato per lavorare solo con IPv4 .. C'è un modo per modificare il mio codice per consentire l'invio e la ricezione dei pacchetti IPv6 e IPv4 ?? Sarebbe difficile per scartare il codice classi, un sacco di miei programmi si basano su questa classe. Vorrei mantenere la classe più vicino al suo stato originale, quindi non ho bisogno di modificare i miei vecchi programmi, cambiare solo la vecchia classe per quello nuovo.

Grazie per qualsiasi aiuto, Max

Invia:

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

Ricezione:

    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
    }
È stato utile?

Soluzione

Altri suggerimenti

classe UdpClient possono essere preparati a ricevere sia IPv4 e IPv6 fornendo una presa 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)

L'invio è più facile, possiamo creare classe UdpClient con l'indirizzo di destinazione specificata (IPv4 o IPv6). AddressFamily può essere fornito nel costruttore, se necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top