如何实现 TcpClient、IPEndPoint、IPAddress 对象的实例化,当作为字符串传递时,为这两种情况实例化 IPv4 和 IPv6 地址

How to implement instantiation of TcpClient, IPEndPoint , IPAddress objects instantiating for both cases IPv4 and IPv6 address when passed As Strings

对于我的 .NET C# 应用程序,我们有一些模块需要通过 TCP/IP 协议进行通信。

我决定使用微软的 System.Net.Sockets API

由 "TcpListener" class 表示的模块可以是

-基于IPv4地址 -基于 IPv6 地址

问题是使用 "TcpClient" class 的模块需要以智能获取 IPv4 或 IPv6 地址的方式实例化 "TcpClient"(即最初作为字符串传递)

具体来说,使用 "TcpClient" class 的模块可以有如下构造函数:

public ClientModule(string ipV4OrIpV6Address, int portNumber){
………………………
…………..
……….
}

当我查看 Microsoft 的文档 (https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient.-ctor?view=netframework-4.8#System_Net_Sockets_TcpClient__ctor_System_Net_IPEndPoint_) 时,我发现了以下 TcpClient 构造函数:

TcpClient(IPEndPoint)

Initializes a new instance of the TcpClient class and binds it to the specified local endpoint.

此外,我尝试搜索更多关于实例化 IPEndPoint class 的信息,我遇到了 ( https://docs.microsoft.com/en-us/dotnet/api/system.net.ipendpoint.-ctor?view=netframework-4.8#System_Net_IPEndPoint__ctor_System_Net_IPAddress_System_Int32_ )

每个模块将位于不同的物理计算机服务器上。

我该如何实例化 Microsoft 的 IPAddress 对象,使其足够智能以将 IPv4 和 IPv6 地址作为字符串处理,而不管哪个作为参数传递?

使用IPAddress.Parse(string ipAddress)构建端点。

它接受包含 IPv4 点分十进制表示法或 IPv6 冒号分隔地址字符串的字符串,以及 returns System.Net.IPAddress.

public void ClientModule(string ipV4OrIpV6Address, int portNumber)
{
   IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ipV4OrIpV6Address), int port); 
TcpClient client = new TcpClient(endpoint);
// Do something with the client
}

TcpClient(string, int) 构造函数最终会调用 IPAddress.TryParse(string) 您传入的字符串值,它会尝试将结果应用于 IPv4 和 IPv6 套接字。

因此,您不必做任何特别的事情。只需将 IP 地址传递给 TcpClient(string, int) 构造函数并让 TcpClient class 处理它(好吧,实际上 Dns class 最终是地址解析度)。应该不需要做任何明确的工作来处理 IPv6 地址。自己解析地址只是浪费代码和时间。