Question

Il y a quelque temps j'ai créé une classe pour faire face à mes programmes de réseau LAN. J'ai récemment mis à jour un de mes ordinateurs portables pour Windows 7 et relized que Windows 7 (ou du moins la façon dont je l'ai mis en place) prend en charge uniquement IPv6, mais mon bureau est encore de retour dans les jours de Windows XP et utilise uniquement IPv4. La classe I créé utilise la classe UdpClient, et est actuellement configuré pour ne travailler qu'avec IPv4 .. Est-il possible de modifier mon code pour autoriser l'envoi et la réception des paquets IPv6 et IPv4 ?? Il serait difficile de supprimer le code des classes, beaucoup de mes programmes reposent sur cette classe. Je voudrais garder la classe aussi proche de son état d'origine, donc je ne pas besoin de modifier mes anciens programmes, passer que la vieille classe pour une mise à jour.

Merci pour toute aide, Max

Envoyer:

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

Recevoir:

    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
    }
Était-ce utile?

La solution

Autres conseils

UdpClient peut être préparé à recevoir à la fois IPv4 et IPv6 en fournissant une prise bimode:

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'envoi est plus facile, nous pouvons créer UdpClient avec l'adresse cible spécifiée (IPv4 ou IPv6). AddressFamily peut être fourni dans le constructeur, si nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top