Xamarin.Forms - соединение TcpClient не удается с System.Net.Sockets.SocketException (0x80004005): сеть недоступна

Задний план:

Я запускаю кроссплатформенное приложение Xamarin.Forms на Nexus 7 (Android API уровня 22), которое настроено (по порядку):

  1. Подключиться к моей сети Wi-Fi
  2. Подключитесь к скрипту Python, который работает на маршрутизаторе / шлюзе (10.0.0.0/5000)
  3. Подключение к аудиоприемнику Bluetooth A2DP

на старте.

  • Моя машина для разработки работает под управлением Windows 7 с Visual Studio 2019 Preview (v16.0.0 Preview 1.1), Xamarin.Forms (v3.4.0.1008975) и Xamarin.Android (v28.0.0).
  • Сеть Wi-Fi обслуживается Raspberry Pi 3 B +, работающим под управлением hostapd и dnsmasq на Raspbian Stretch. Эта точка доступа раздает IP-адреса в диапазоне от 10.0.0.1 до 10.0.0.20 со шлюзом по умолчанию 10.0.0.0. В настоящее время в сети нет Интернета, но я могу добавить его в будущем.
  • Pi также запускает скрипт на Python, который действует как сервер для этого приложения. Приложение должно подключаться к этому сценарию через .NET TcpClient, чтобы оно могло получать данные датчиков от Pi.

Проблема:

Приложение успешно подключается к Wi-Fi и Bluetooth (шаги 1 и 3), но я получаю System.Net.Sockets.SocketException (HRESULT: 0x80004005), когда оно пытается подключиться к скрипту Python (шаг 2). Вот трассировка стека:

{System.Net.Sockets.SocketException (0x80004005): Network is unreachable
at System.Net.Sockets.SocketAsyncResult.CheckIfThrowDelayedException () 
[0x00014] in <165f7048c1ba483e8b4fcc215c691e9e>:0 
at System.Net.Sockets.Socket.EndConnect (System.IAsyncResult asyncResult) 
[0x0002c] in <165f7048c1ba483e8b4fcc215c691e9e>:0 
at System.Net.Sockets.TcpClient.EndConnect (System.IAsyncResult asyncResult) 
[0x0000c] in <165f7048c1ba483e8b4fcc215c691e9e>:0 
at System.Threading.Tasks.TaskFactory`1[TResult].FromAsyncCoreLogic 
(System.IAsyncResult iar, System.Func`2[T,TResult] endFunction, 
System.Action`1[T] endAction, System.Threading.Tasks.Task`1[TResult] 
promise, System.Boolean requiresSynchronization) [0x00019] in 
<76298308b9444eca9d8db328b3554473>:0 
--- End of stack trace from previous location where exception was thrown ---
at Liberty_Console.Models.Statics+<ConnectAsync>d__2.MoveNext () [0x00052] 
in C:\Users\Micah\Source\Repos\Liberty Console\Liberty Console\Liberty 
Console\Models\Statics.cs:27 }

И это код, который его вызывает:

TcpClient client = new TcpClient(AddressFamily.InterNetwork);
await client.ConnectAsync("10.0.0.0", 5000); //System.Net.Sockets.SocketException

У меня есть:

  • Убедитесь, что приложение запрашивает и получает эти разрешения:
    • android.permission.ACCESS_NETWORK_STATE
    • android.permission.ACCESS_WIFI_STATE
    • android.permission.BLUETOOTH
    • android.permission.BLUETOOTH_ADMIN
    • android.permission.CHANGE_NETWORK_STATE
    • android.permission.CHANGE_WIFI_STATE
    • android.permission.INTERNET
  • Убедитесь, что планшет подключается к сети Wi-Fi и получает действительный IP-адрес (10.0.0.X).
  • Убедитесь, что порт 5000 открыт на маршрутизаторе / шлюзе
  • Убедитесь, что скрипт Python работает правильно (отлажен из консольного приложения)
  • Пробовал пинговать роутер / шлюз с помощью класса System.Net.NetworkInformation.Ping
    • Время ожидания запроса истекло
  • Исследовал проблему пару часов (безрезультатно)

Мой вычет:

Судя по моим тестам и отладке, кажется, что приложение не может делать запросы в сети (следовательно, оно «недоступно»). Это может быть связано с:

  • Как структурирована сеть и подсеть WiFi (например, возможно, приложение Android пытается работать на 192.168.1.X вместо 10.0.0.X)
  • Тот факт, что сеть Wi-Fi не имеет подключения к Интернету (поэтому клиенты ограничены локальной сетью)
  • Исходящий брандмауэр / мера безопасности в Android, Xamarin или на самом устройстве
  • Различия между TcpClient в Xamarin / Android и в обычной платформе .NET

Любая помощь приветствуется!

Сообщите мне, если вопрос требует более подробной информации или пояснения.

убедитесь, что они находятся в одном диапазоне IP

1SaeedSalehi 06.01.2019 10:41

@ 1SaeedSalehi в том-то и дело: IP адрес в настройках планшета правильный (в том же диапазоне), но TcpClient все равно не может подключиться.

Micah Vertal 08.01.2019 21:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 132
0

Другие вопросы по теме

Похожие вопросы