Вопрос

Некоторое время назад я создал класс для работы с моими сетевыми программами локальной сети.Недавно я обновил один из своих ноутбуков до Windows 7 и обнаружил, что Windows 7 (или, по крайней мере, то, как я ее настроил) поддерживает только IPv6, но мой рабочий стол все еще работает во времена Windows xp и использует только 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
    }
Это было полезно?

Решение

Я думаю, это могло бы вам помочь: Сервер C #, поддерживающий IPv6 и IPv4 на одном порту

Другие советы

UdpClient может быть подготовлен к приему как по IPv4, так и по IPv6, предоставив двухрежимный сокет:

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