Search code examples
c#xamarinxamarin.formstcpclient

How do you get the IP address of a server (not a webserver) but a TCP server created on a wifi module in Xamarin.Forms


I need to get the IP address of a Wi-Fi module, running a TCP server. The application will open the WiFi connections settings page to allow the user to connect to the Wi-Fi module's created network (requiring the password to be entered)- see attached picture. The server (Wi-FI module) IP address is 172.1.4.155 (for example) but when I try to get the IP address in Xamarin.Forms using GetLocalIPAddress() (attached below), the address it returns is the local IP address of the device (Phone)- 172.1.4.55 (for example). I need to be able to get the IP address programmatically without a user input in an Application.

Example of the WiFi connection Settings page

Is there any way to get the IP address of the (external) non-device specific IP address? I assume the returned IP address of the phone is the DHCP assigned IP address. I need to get the server IP address as it is essential to establish a TCP socket connection between the phone and the WiFi module. I have been trying to look for a solution without any success for a few days now so any help/suggestions or examples will be greatly appreciated.

The code below is the GetLocalIPAddress() function to get the IP address.

    public static string GetLocalIPAddress()
    {
        var host = Dns.GetHostEntry(Dns.GetHostName());
        foreach (var ip in host.AddressList)
        {
            if (ip.AddressFamily == AddressFamily.InterNetwork)
            {
                return ip.ToString();
            }
            //return "";
        }
        //throw new Exception("Local IP Address Not Found!");
        return "None";
    }

Solution

  • How to Read IP Address in XAMARIN Form, i have Created the DependencyServices in both IOS and Android projects and getting a proper IP address. Below is code to get IP address.

    In PCL Project

    public interface IIPAddressManager
        {
            String GetIPAddress();
        }
    

    In IOS Project

    [assembly: Dependency(typeof(YourAppNamespace.iOSUnified.iOS.DependencyServices.IPAddressManager))]
    
    namespace YourAppNamespace.iOSUnified.iOS.DependencyServices
    {
        class IPAddressManager : IIPAddressManager
        {
            public string GetIPAddress()
            {
                String ipAddress = "";
    
                foreach (var netInterface in NetworkInterface.GetAllNetworkInterfaces())
                {
                    if (netInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 ||
                        netInterface.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
                    {
                        foreach (var addrInfo in netInterface.GetIPProperties().UnicastAddresses)
                        {
                            if (addrInfo.Address.AddressFamily == AddressFamily.InterNetwork)
                            {
                                ipAddress = addrInfo.Address.ToString();
    
                            }
                        }
                    }
                }
    
                return ipAddress;
            }
        }
    }
    

    In Android Project.

    [assembly: Dependency(typeof(YourAppNamespace.Android.Android.DependencyServices.IPAddressManager))]
    
    namespace YourAppNamespace.Android.Android.DependencyServices
    {
        class IPAddressManager : IIPAddressManager
        {
            public string GetIPAddress()
            {
                IPAddress[] adresses = Dns.GetHostAddresses(Dns.GetHostName());
    
                if (adresses !=null && adresses[0] != null)
                {
                    return adresses[0].ToString();
                }
                else
                {
                    return null;
                }
            }
        }
    }
    

    Then call a DependencyServices in UI project.

    string ipaddress = DependencyService.Get<IIPAddressManager>().GetIPAddress