Use UDPClient com IPv4 e IPv6?
-
20-09-2019 - |
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
}
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.