Xamarin.Forms - сбой подключения TcpClient с System.Net.Sockets.SocketException (0x80004005): сеть недоступна
Фон:
Я использую кроссплатформенное приложение Xamarin.Forms на Nexus 7 (уровень API Android 22), которое настроено (по порядку):
- Подключиться к моей сети WiFi
- Подключитесь к скрипту Python, который выполняется на маршрутизаторе / шлюзе (
10.0.0.0/5000
) - Подключите к аудиоприемнику A2DP Bluetooth
на старте.
- Моя машина для разработки работает под управлением 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
на Растбиан. Эта точка доступа раздает 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
Любая помощь с благодарностью!
Дайте мне знать, если вопрос требует более подробной информации или уточнения.