Android Code Snippet [B4X] Find all reachable ips in the local network

Slightly based on: https://stackoverflow.com/questions...me-wi-fi-network-in-android/21091575#21091575
Compatible with B4A and B4J.

Manifest editor (B4A only):
B4X:
AddPermission(android.permission.ACCESS_WIFI_STATE)
AddPermission(android.permission.INTERNET)

Depends on (j)Network library.
Code:
B4X:
Private Sub ScanNetwork
    Dim server As ServerSocket 'ignore
    Dim MyIp As String = server.GetMyIP
    If MyIp = "127.0.0.1" Then
        Log("Not connected to network.")
        Return
    End If
    Dim InetAddress As JavaObject
    InetAddress.InitializeStatic("java.net.InetAddress")
    Dim host As JavaObject = InetAddress.RunMethod("getByName", Array(MyIp))
    Dim ip() As Byte = host.RunMethod("getAddress", Null)
    Dim jME As JavaObject = Me
    For i = 1 To 254
        ip(3) = i
        Dim address As JavaObject = InetAddress.RunMethod("getByAddress", Array(ip))
        jME.RunMethod("checkAddress", Array(address, 300, False)) 'change to true to try and resolve host names. It will be a bit slower.
    Next
    For i = 1 To 254
        Wait For Address_Checked (HostAddress As String, Reachable As Boolean, HostName As String)
        If Reachable Then
            Log(HostAddress & ", " & HostName)
        End If
    Next
    Log("done")
End Sub


#if Java
public void checkAddress(java.net.InetAddress address, int timeout, boolean getHostName) {
    final String hostAddress = address.getHostAddress();
    BA.runAsync(getBA(), null, "address_checked", new Object[] {false, hostAddress, ""}, new java.util.concurrent.Callable<Object[]>() {
        public java.lang.Object[] call() throws Exception {
                if (address.isReachable(timeout))
                    return new Object[] {hostAddress, true, getHostName ? address.getHostName() : ""};
                else
                    return new Object[] {hostAddress, false, ""};
            }
            }
    
    );
}
#End If

This should be called from a class, such as B4XMainPage.
It runs pretty fast. Takes maybe 3 seconds to scan the network here (and it doesn't block the main thread).
 
Last edited:

peacemaker

Expert
Licensed User
Longtime User
<nit-picker>For /24 nets only, formally </nit-picker >
 

aminoacid

Active Member
Licensed User
Longtime User
There is an option to resolve host names. Based on my tests it is relevant for B4J (in B4A it will return the address immediately), but it is quite slow so I turned it off by default.

Help! I tried to figure out the option to resolve the hostnames but I give up! I have plenty of time to wait even if it's slow Thanks!
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…