繁体   English   中英

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

[英]UDP Client and server using IPV6

我需要使用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. 使用IPV 6是否可以克服NAT遍历问题?

从技术上讲,没有UDP服务器,它们始终是客户端。 客户端只是连接到网卡,然后开始发送和接收数据报而没有任何低级协议(这就是为什么数据报可能永远不会到达的原因)。 实际上,UDP客户端和“服务器”之间的唯一区别是,这最后一个具有公共固定IP(无论哪个OS都不重要)。

要将UDP客户端迁移到IPV6,请使用:

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

我目前正在以使同一个客户端同时向IPv4和IPv6发送/从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,因为它与TCP一样同时兼容两种IP模式,但要容易得多。

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM