Как правильно свзяать локальный узел (Tcp/Udp)Client'a для принятия входящих данных?

144
06 июля 2021, 19:10

Когда я инициализирую TcpClient с указанием в конструкторе IPAddress отличного от 0.0.0.0 (e.g. IPAddress.Any), то при попытке соединиться с удаленым хостом, происходит исключение:

System.Net.Sockets.SocketException: "Сделана попытка выполнить операцию на сокете при отключенной сети ---.---.---.---:----

У меня включена трассировка сети, вот ее лог:

System.Net.Sockets Verbose: 0 : [3192] Entering DNS::GetHostEntry(ヒミコ)
System.Net.Sockets Verbose: 0 : [3192] Entering DNS::GetHostByName(ヒミコ)
System.Net.Sockets Verbose: 0 : [3192] Exiting DNS::GetHostByName()     -> IPHostEntry#21950498
System.Net.Sockets Verbose: 0 : [3192] Exiting DNS::GetHostEntry()  -> IPHostEntry#21950498
System.Net.Sockets Verbose: 0 : [3192] Entering TcpClient#37614147::TcpClient(169.254.93.194:6881#-1034034104)
System.Net.Sockets Verbose: 0 : [3192] Entering Socket#35460724::Socket(AddressFamily#2)
System.Net.Sockets Verbose: 0 : [3192] Exiting Socket#35460724::Socket() 
System.Net.Sockets Verbose: 0 : [3192] Entering Socket#35460724::Bind(169.254.93.194:6881#-1034034104)
System.Net.Sockets Verbose: 0 : [3192] Exiting Socket#35460724::Bind() 
System.Net.Sockets Verbose: 0 : [3192] Exiting TcpClient#37614147::TcpClient() 
System.Net.Sockets Verbose: 0 : [3192] Entering TcpClient#37614147::BeginConnect(37.146.57.197#-986082779)
System.Net.Sockets Verbose: 0 : [3192] Entering Socket#35460724::BeginConnect(37.146.57.197#-986082779)
System.Net.Sockets Verbose: 0 : [3192] Entering Socket#35460724::BeginConnect(37.146.57.197:6881#-986085180)
System.Net.Sockets Verbose: 0 : [3192] Entering Socket#35460724::BeginConnectEx()
System.Net.Sockets Verbose: 0 : [3192] Exiting Socket#35460724::BeginConnectEx()    -> ConnectOverlappedAsyncResult#65961401
System.Net.Sockets Verbose: 0 : [3192] Exiting Socket#35460724::BeginConnect()  -> ConnectOverlappedAsyncResult#65961401
System.Net.Sockets Verbose: 0 : [3192] Exiting TcpClient#37614147::BeginConnect() 
System.Net.Sockets Verbose: 0 : [9356] Entering TcpClient#37614147::EndConnect(ConnectOverlappedAsyncResult#65961401)
System.Net.Sockets Verbose: 0 : [9356] Entering Socket#35460724::EndConnect(ConnectOverlappedAsyncResult#65961401)
System.Net.Sockets Verbose: 0 : [9356] Entering Socket#35460724::InternalEndConnect(ConnectOverlappedAsyncResult#65961401)
System.Net.Sockets Error:   0 : [9356] Socket#35460724::UpdateStatusAfterSocketError() - NetworkUnreachable

Я чего-то не до понял, или мне нужно передавать в конструктор сам адрес куда будет идти соединение?

Или как это исправить?

Answer 1

Вы пытаетесь подключится к 169.254.93.194. Это Link-Local адрес - он имеет смысл только в рамках физического сегмента сети - той части LAN, куда воткнут комп с этим адресом.

Пакеты на 169.254.x.x не маршрутизируются, и подключится к нему через интернет (как пытаетесь вы) не получится.

Сокет при попытке открыть такое подключение бросает NetworkUnreachable -
No route to the remote host exists, который в user friendly исключении переведен как "Сделана попытка выполнить операцию на сокете при отключенной сети". На самом деле это просто ошибка роутинга.

Судя по вашим вопросам - вы пытаетесь подключится к пиру, выданному вам трекером. Трекер вполне мог выдать те адреса, которые прислали ему пиры, "как есть", не отфильтровывая заведомо недоступные. Просто учитывайте, что часть адресов может в принципе быть невалидной для подключени извне.

READ ALSO
Последовательное использование lock()

Последовательное использование lock()

В моем случае нужно, чтоб процедуры P1,P2,P3 могли пересекаться между собой

100
Не получается обнулить текст в Input Field в Unity на C#

Не получается обнулить текст в Input Field в Unity на C#

У меня есть Input Field для ввода названия проекта, мне нужно, чтобы текст в нем обнулялся по нажатию на кнопку "Отмена"Подскажите, пожалуйста, решение...

94
Замена элементов массива с помощью linq

Замена элементов массива с помощью linq

Как с помощью linq заменить все элементы целочисленной последовательности, заданной с помощью EnumerableRange на сумму их цифр

121
Оптимизация MySQL-запросов для поля created_at

Оптимизация MySQL-запросов для поля created_at

Имеется таблица с более, чем 3 млн строкПо этой таблице необходимо делать запрос на получение количества строк в определённые временные промежутки...

107