将 UdpClient 与 IPv4 和 IPv6 结合使用?

问题描述 投票:0回答:3

不久前,我创建了一个类来处理我的 LAN 网络程序。我最近将一台笔记本电脑升级到 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# networking ipv6 ipv4 udpclient
3个回答
0
投票

我认为这可能对您有帮助:在同一端口上支持 IPv6 和 IPv4 的 C# 服务器


0
投票

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)

发送更容易,我们可以使用指定的目标地址(IPv4或IPv6)创建UdpClient。如果需要,可以在构造函数中提供 AddressFamily。


0
投票

UdpClient 没有端口的构造函数不会立即绑定套接字。另外 UpdClient 公开了它的套接字。这都允许修改套接字选项然后绑定。

using var client = new UdpClient(AddressFamily.InterNetworkV6);
client.Client.DualMode = true; // enables both IPv4 and IPv6
client.Client.Bind(new IPEndPoint(IPAddress.IPv6Any, 15621));

var incData = await client.ReceiveAsync();

运行它并检查它是否正在监听

0.0.0.0
[::]

PS C:\> netstat -an | findstr 15621
  UDP    0.0.0.0:15621          *:*
  UDP    [::]:15621             *:*
© www.soinside.com 2019 - 2024. All rights reserved.