Создание сокета, ведущего к сети, недоступно — ENETUNREACH

#android

#Android

Вопрос:

У меня проблема с созданием сокета. Ошибка заключается в следующем

java.net.ConnectException: не удалось подключиться к / 192.168.1.103 (порт 23): сбой подключения: ENETUNREACH (сеть недоступна)

Вот часть моего кода

 WifiConfiguration wifiConfiguration = new WifiConfiguration();

wifiConfiguration.SSID = """   wifiName   """;
wifiConfiguration.preSharedKey = """   password   """;

WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
int networkId = wifiManager.addNetwork(wifiConfiguration);

if (networkId != -1) 
{
   wifiManager.enableNetwork(networkId, true);
   new Thread(new GetMacThread()).start();
}

class GetMacThread implements Runnable{
private Socket socket;
private int portNumber = 23;
private String myIP = "192.168.1.103";
@Override
public void run() 
{

    try {

        socket = new Socket(myIP, portNumber);
        System.out.println("Socket Thread:" socket);
    } catch (UnknownHostException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
  

Я почти уверен, что это не проблема с сетью (IP и порт в порядке, я также добавил разрешения в манифест), потому что я протестировал его с подключенной сетью Wi-Fi, и прокомментированная строка wifiManager.enableNetwork(networkId, true) и сокет были выполнены правильно. Тогда программа работала. Итак, проблема в том, что он работает только с ранее включенным Wi-Fi.

Я также попытался сначала проверить соединение Wi-Fi с помощью ConnectivityManager перед созданием сокета, но это ничего не изменило.

Есть ли у вас какие-либо идеи, почему сокет выходит из строя в этом конкретном порядке?

Комментарии:

1. Вероятно, я нашел решение. Android не удалось создать сокет, потому что для подключения к Wi-Fi требуется больше времени, а ConnectivityManager проверяет, включен ли Wi-Fi (проверка того, включен ли Wi-Fi, это не обязательно означает, что он подключен). Поэтому я использовал широковещательный приемник, чтобы проверить, было ли установлено соединение.

2. Ваше решение дало мне отличную подсказку о том, что пошло не так в моем собственном проекте, поэтому я решил это. Спасибо!

Ответ №1:

Метод ConnectivityManager.bindProcessToNetwork() помог мне в аналогичном случае. Дополнительную информацию вы можете найти здесь — https://android-developers.googleblog.com/2016/07/connecting-your-app-to-wi-fi-device.html .