UDP使用IPV6协议的客户端和服务器

本文关键字:客户端 服务器 协议 使用 IPV6 UDP | 更新日期: 2023-09-27 18:04:25

我需要使用IPV6实现一个简单的c# UDP客户端服务器应用程序。但是我不知道怎么做。我已经做了一个使用IP版本4的UDP应用程序。下面的代码显示了我的源代码。

UDP服务器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace UDPServer
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Net.Sockets.UdpClient server = new System.Net.Sockets.UdpClient(3478);
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            byte[] data = new byte[1024];
            data = server.Receive(ref sender);
            server.Close();
            string stringData = Encoding.ASCII.GetString(data, 0, data.Length);
            Console.WriteLine("Response from " + sender.Address + Environment.NewLine + "Message: " + stringData);
            Console.ReadLine();
        }
    }
}

UDP客户端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace UDPClient
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Net.Sockets.UdpClient sock = new System.Net.Sockets.UdpClient();
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse("10..10.10.10"), 3478);
            byte[] data = Encoding.ASCII.GetBytes("Hello UDP Server!!!");
            sock.Send(data, data.Length, iep);
            sock.Close();
            Console.WriteLine("Message sent.");
            Console.ReadLine();
        }
    }
}
  1. 请给我一个关于"如何转换我的应用程序到IPV6"的想法或例子?
  2. 是否有可能通过使用ipv6来克服NAT穿越问题?

UDP使用IPV6协议的客户端和服务器

技术上没有UDP服务器这样的东西,它们总是客户端。客户端只是连接到网卡,然后开始发送和接收数据报,而不需要任何低级协议(这就是数据报可能永远不会到达的原因)。事实上,UDP客户端和"服务器"之间的唯一区别是,后者有一个公共固定IP(无论哪个操作系统都没有)。

为了将您的UDP客户端迁移到IPV6使用:

System.Net.Sockets.UdpClient server = new System.Net.Sockets.UdpClient(3478, System.Net.Sockets.AddressFamily.InterNetworkV6);

我目前正在努力让相同的客户端发送/接收到/从IPv4和IPv6在同一时间,但它不工作。使用这个,你总是被迫使用IPv4或IPv6(这很糟糕)。

这样做不工作(至少现在):

server.Client.DualMode = true;
server.Client.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, 0);

第一个选项理论上启用双模式:同时使用IPv4和IPv6工作。第二个选项允许在内部使用两种类型的IP地址。

你也必须使用IPAddress.IPv6Any而不是IPAddress.Any

这里最有趣的部分是,使用IPv6,远程"服务器"能够向客户端发送数据报(总是如果客户端先向"服务器"发送数据报),使用IPv4是不可能的。

我目前正在研究和调查这个UDP噩梦,但事实是我倾向于迁移到WebSockets,因为它同时兼容两种IP模式,就像TCP一样,但要容易得多。

希望能有所帮助。