简体   繁体   中英

How to bind a socket to local wifi network address on Android?

I want to bind a socket to local wifi network address to make sure that requests are not running through 3g or other networks. I tried this code:

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);

And it throws: java.net.BindException: bind failed: EACCES (Permission denied) I checked permissions in Manifest. Looks like all needed permissions are granted:

<!-- 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" />

You cannot bind to ports below 1024 without superuser access. So the Socket.bind() to port 80 is what is throwing an exception. Pick a custom port which is above 1024. For example, most user started web servers use port 8080.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM