Utilizzare classe UdpClient con IPv4 e IPv6?
-
20-09-2019 - |
Domanda
Un po 'di tempo fa ho creato una classe a che fare con i miei programmi di rete LAN. Recentemente ho aggiornato uno dei miei computer portatili a Windows 7 e relized che Windows 7 (o almeno il modo in cui l'ho impostato su) supporta solo IPv6, ma il mio desktop è ancora indietro nei Windows XP giorni, e utilizza solo IPv4. La classe ho creato utilizza la classe classe UdpClient, ed è attualmente configurato per lavorare solo con IPv4 .. C'è un modo per modificare il mio codice per consentire l'invio e la ricezione dei pacchetti IPv6 e IPv4 ?? Sarebbe difficile per scartare il codice classi, un sacco di miei programmi si basano su questa classe. Vorrei mantenere la classe più vicino al suo stato originale, quindi non ho bisogno di modificare i miei vecchi programmi, cambiare solo la vecchia classe per quello nuovo.
Grazie per qualsiasi aiuto, Max
Invia:
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 );
}
Ricezione:
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
}
Soluzione
Credo che questo potrebbe aiutare: # server di C che supporta IPv6 e IPv4 sulla stessa porta
Altri suggerimenti
classe UdpClient possono essere preparati a ricevere sia IPv4 e IPv6 fornendo una presa 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)
L'invio è più facile, possiamo creare classe UdpClient con l'indirizzo di destinazione specificata (IPv4 o IPv6). AddressFamily può essere fornito nel costruttore, se necessario.