簡體   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