【问题标题】: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如何获取服务器(不是网络服务器)的 IP 地址,而是在 Xamarin.Forms 的 wifi 模块上创建的 TCP 服务器
【发布时间】:2018-08-02 19:18:01
【问题描述】:

我需要获取运行 TCP 服务器的 Wi-Fi 模块的 IP 地址。该应用程序将打开 WiFi 连接设置页面,以允许用户连接到 Wi-Fi 模块创建的网络(需要输入密码)-见附图。服务器(Wi-FI 模块)IP 地址是 172.1.4.155(例如),但是当我尝试使用 GetLocalIPAddress() 在 Xamarin.Forms 中获取 IP 地址时(附在下面),它返回的地址是设备(电话)的本地IP地址 - 172.1.4.55(例如)。我需要能够以编程方式获取 IP 地址,而无需用户在应用程序中输入。

有没有办法获取(外部)非设备特定 IP 地址的 IP 地址?我假设返回的电话 IP 地址是 DHCP 分配的 IP 地址。我需要获取服务器 IP 地址,因为必须在手机和 WiFi 模块之间建立 TCP 套接字连接。几天来,我一直在尝试寻找没有任何成功的解决方案,因此我们将不胜感激任何帮助/建议或示例。

下面的代码是GetLocalIPAddress()函数获取IP地址。

    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";
    }

【问题讨论】:

  • 在我看来,如果您假设它是由 DHCP 分配的 IP 地址,这很容易发生竞争。当您对答案进行操作时,您的租约可能已经到期并且(无论出于何种原因)分配了一个新地址,而不是继续使用旧地址。
  • @Damien_The_Unbeliever,这是一个非常有效的观点。有什么办法可以解决这个问题,或者至少让 IP 在重新分配 IP 之前尝试创建与 IP 的套接字连接?

标签: c# xamarin xamarin.forms tcpclient


【解决方案1】:

如何在 XAMARIN 表单中读取 IP 地址,我已经在 IOS 和 Android 项目中创建了 DependencyServices 并获得了正确的 IP 地址。下面是获取IP地址的代码。

在 PCL 项目中

public interface IIPAddressManager
    {
        String GetIPAddress();
    }

在IOS项目中

[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;
        }
    }
}

在 Android 项目中。

[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;
            }
        }
    }
}

然后在 UI 项目中调用一个 DependencyServices。

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

【讨论】:

  • 此方法可以为您获取 IP 地址,但不适用于我的特定需要 - 我需要能够获取 TCP 服务器的 IP 地址(不是设备的 DHCP 分配的 IP 地址) .
猜你喜欢
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 2013-03-27
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多