Utilice UdpClient con IPv4 e IPv6?
-
20-09-2019 - |
Pregunta
Hace poco he creado una clase para hacer frente a mis programas de redes LAN. Recientemente he actualizado uno de mis ordenadores portátiles de Windows 7 y relized que Windows 7 (o al menos de la manera que tengo configurado) sólo es compatible con IPv6, pero mi escritorio todavía está de vuelta en los días de Windows XP, y sólo utiliza IPv4. La clase creé utiliza la clase UdpClient, y se pone actualmente a sólo el trabajo con IPv4 .. ¿Hay una manera de modificar mi código para permitir el envío y recepción de paquetes IPv6 e IPv4 ?? Sería difícil de desechar el código de clases, muchos de mis programas se basan en esta clase. Me gustaría mantener a la clase lo más cercano a su estado original, por lo que no tenga que modificar mis programas más antiguos, sólo el interruptor de la clase de edad para el actualizado.
Gracias por cualquier y toda la ayuda, Max
Enviar:
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 );
}
Recibir:
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
}
Solución
Creo que esto podría ayudarle a: C # servidor que soporte IPv6 e IPv4 en el mismo puerto
Otros consejos
UdpClient se puede preparar para recibir en IPv4 e IPv6, proporcionando un zócalo 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)
El envío es más fácil, podemos crear UdpClient con la dirección de destino especificada (IPv4 o IPv6). AddressFamily se puede proporcionar en el constructor, si es necesario.