Pergunta

Há pouco tempo, criei uma aula para lidar com meus programas de rede LAN. Recentemente, atualizei um dos meus laptops para o Windows 7 e avaliei se o Windows 7 (ou pelo menos da maneira que eu a configurei) suporta apenas IPv6, mas minha área de trabalho ainda está de volta nos dias do Windows XP e usa apenas IPv4. A classe que eu criei usa a classe UDPClient e atualmente está configurada para funcionar apenas com o IPv4. Existe uma maneira de modificar meu código para permitir o envio e o recebimento de pacotes IPv6 e IPv4? Seria difícil descartar o código das classes, muitos dos meus programas dependem dessa classe. Gostaria de manter a classe o mais próximo de seu estado original, para que não precise modificar meus programas mais antigos, trocar apenas a classe antiga para a atualizada.

Obrigado por toda e qualquer ajuda, Max

Mandar:

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

Receber:

    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
    }
Foi útil?

Solução

Eu acho que isso pode ajudá -lo: Servidor C# que suporta IPv6 e IPv4 na mesma porta

Outras dicas

O UDPClient pode estar preparado para receber no IPv4 e IPv6, fornecendo um soquete de 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)

O envio é mais fácil, podemos criar UDPClient com o endereço de destino especificado (IPv4 ou IPv6). A Família de Endereço pode ser fornecida no construtor, se necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top