Как реализовать создание экземпляров объектов TcpClient, IPEndPoint, IPAddress для обоих случаев: адреса IPv4 и IPv6 при передаче в виде строк - PullRequest
1 голос
/ 25 июня 2019

Для моего приложения .NET C # у нас есть модули, которые должны взаимодействовать через протокол TCP / IP.

Я решил использовать Microsoft System.Net.Sockets API

Модуликоторые представлены классом "TcpListener" могут быть либо

-IPv4-адрес на основе -IPv6-адрес

Проблема заключается в том, что модули, использующие класс "TcpClient", должны создавать экземпляры«TcpClient» таким образом, что разумно взять IPv4 или IPv6-адрес (который изначально передается в виде строки)

Для уточнения, модуль, использующий класс «TcpClient», может иметь конструктор, подобныйследующее:

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)

Инициализирует новый экземпляр класса TcpClient и связывает его с указанной локальной конечной точкой.

Кроме того, я попытался найти больше информации о создании экземпляраКласс IPEndPoint, и я натолкнулся (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 как строк независимо от того, какой из них передается в качестве аргумента?

Ответы [ 2 ]

3 голосов
/ 25 июня 2019

Используйте IPAddress.Parse (строка ipAddress) для построения конечной точки.

Принимает строку, содержащую либо десятичную запись IPv4 с точками, либо строку адреса, разделенную двоеточием IPv6, и возвращает 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
}
2 голосов
/ 25 июня 2019

Конструктор TcpClient(string, int) в конечном итоге вызывает IPAddress.TryParse(string) для передаваемого вами строкового значения и пытается применить результат к сокету IPv4 и IPv6.

* 1006Итак, вам не нужно делать ничего особенного.Просто передайте IP-адрес конструктору TcpClient(string, int) и позвольте классу TcpClient разобраться с ним (ну, на самом деле класс Dns в конечном итоге и определяет адрес).Там не должно быть необходимости делать какие-либо явные работы для обработки адресов IPv6.Парсинг адреса самостоятельно - просто трата кода и времени.
...