我需要使用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();
}
}
}
从技术上讲,没有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一样,但更容易。
希望能帮助到你。