سؤال

ومنذ فترة وجيزة أنا خلقت فئة للتعامل مع برامج الشبكات LAN بلدي. أنا ورفع مستواها في الآونة الأخيرة واحدة من أجهزة الكمبيوتر المحمولة بلدي إلى ويندوز 7 وrelized أن ويندوز 7 (أو على الأقل أسلوب لدي اقامة) تدعم فقط IPv6، ولكن سطح المكتب لا يزال مرة أخرى في أيام ويندوز إكس بي، ويستخدم فقط عناوين IPv4. الطبقة أنا خلقت الاستخدامات الطبقة UdpClient، وحاليا الإعداد لتعمل فقط مع عناوين IPv4 .. هل هناك طريقة لتعديل قانون بلدي للسماح بإرسال واستقبال حزم IPv6 و IPv4 ؟؟ وسيكون من الصعب على الغاء قانون الطبقات، والكثير من البرامج بلدي تعتمد على هذه الفئة. أود أن إبقاء الطبقة أقرب إلى حالته الأصلية، لذلك أنا لا تحتاج إلى تعديل البرامج القديمة بلدي، والتبديل الوحيد للخروج من الطبقة القديمة لواحد المحدثة.

وشكرا على اي وكل مساعدة، ماكس

وإرسال:

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

والتلقي:

    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
    }
هل كانت مفيدة؟

المحلول

نصائح أخرى

وUdpClient يمكن أن تكون على استعداد لتلقي على كل من IPv4 و IPv6 من خلال توفير مأخذ 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)

وإرسال أسهل، ونحن يمكن أن تخلق UdpClient مع عنوان الهدف المحدد (IPV4 و IPV6). ويمكن توفير AddressFamily في منشئ، إذا لزم الأمر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top