Как привязать сокет к локальному сетевому адресу на Android?

Я хочу привязать сокет к локальному сетевому адресу Wi-Fi, чтобы убедиться, что запросы не выполняются через 3G или другие сети. Я попробовал этот код:

public static String getIpAddress(WifiManager wifiManager) {
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    int ipAddress = wifiInfo.getIpAddress();
    return String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff),
            (ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff));
}

Socket socket = new Socket();
String localIpAddress = getIpAddress(wifiManager);
socket.bind(new InetSocketAddress(localIpAddress, 80));
socket.connect(new InetSocketAddress(serverHostname, serverPort), (int)   timeoutMs);

И это бросает:java.net.BindException: bind failed: EACCES (Permission denied)Я проверил разрешения в манифесте. Похоже, все необходимые разрешения предоставляются:

<!-- Uses: show 'disconnected' message when not connected to the internet -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<!-- Uses: record wifi network name when setting up a device -->
<!-- Uses: device wifi setup -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<!-- Uses: device wifi setup -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />

1 ответ

Решение

Вы не можете привязать порты ниже 1024 без прав суперпользователя. Итак Socket.bind() к порту 80 это то, что выдает исключение. Выберите пользовательский порт, который выше 1024. Например, большинство запущенных пользователем веб-серверов используют порт 8080.

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