Xamarin.Forms - сбой подключения TcpClient с System.Net.Sockets.SocketException (0x80004005): сеть недоступна - PullRequest
0 голосов
/ 04 января 2019

Справочная информация:

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

  1. Подключение к моей сети WiFi
  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).
  • Сеть WiFi размещена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
  • Убедитесь, что планшет подключается к сети WiFi и получает действительныйIP-адрес (10.0.0.X)
  • Гарантированный порт 5000 открыт на маршрутизаторе / шлюзе
  • Убедитесь, что скрипт Python работает правильно (отлажено из консольного приложения)
  • Пытался пропинговать роутер / шлюз, используя System.Net.NetworkInformation.Ping класс
    • Время ожидания запроса истекло
  • Исследовал проблему в течение пары часов (безрезультатно)

Мой вывод:

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

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

Любая помощь очень ценится!

Дайте мне знать, если вопрос требует большеподробности или уточнения.

...