Java-Android,在网络共享和连接到接入点时检测WiFi的本地IP和子网掩码

Java-Android,在网络共享和连接到接入点时检测WiFi的本地IP和子网掩码,第1张

概述我需要在Android设备上检测WiFi网络上的本地IP地址和子网掩码(以便严格为本地子网正确计算UDP广播地址).将设备连接到接入点后,以下各项将正常工作://OnlyworkswhenNOTtetheringWifiManagerwifi=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);DhcpIn

我需要在Android设备上检测WiFi网络上的本地IP地址和子网掩码(以便严格为本地子网正确计算UDP广播地址).

将设备连接到接入点后,以下各项将正常工作:

// Only works when NOT tetheringWifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);DhcpInfo dhcp = wifi.getDhcpInfo();if (dhcp == null)    throw new IOException("No DHCPInfo on WiFi sIDe.");foo(dhcp.ipAddress, dhcp.netmask);

但是,当它是通过束缚的androID设备提供访问点时,它是行不通的:DhcpInfo似乎包含由DCHP服务器设置的信息,而AndroID设备是它的客户端,而不是当它是提供DHCP服务的AndroID设备本身时.进行网络共享时,我能找到的最有希望的解决方案是:

// No way to get subnet maskWifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);WifiInfo info = wifi.getConnectionInfo();if (info == null)   throw new IOException("No connection info on WiFi sIDe.");foo(info.getIpAddress(), info.??? /* netmask*/ );

编辑:错误,在我的测试中,即使没有网络共享也只能使用.绑定时,IP始终为0.

但是没有像WifiInfo.getNetMask()这样的东西,在这种情况下如何获得子网掩码? (这种缺席使我感到非常奇怪,因为那里还有很多其他信息.我是否缺少明显的东西?)

另外,理想情况下,我想要一个无需区分AndroID设备是否提供网络共享的解决方案,并且无论哪种情况,只要在WiFi设备上,都可以获取WiFi网络上的本地IP地址和子网掩码.提供或接入点的客户端.

即使是标准Java(即非AndroID专用)NetworkInterface.getNetworkInterfaces(),似乎也没有办法获取子网掩码(除了不允许区分与WiFi相对应的).我想念什么?

解决方法:

我目前发现的最佳解决方案:

这让我感到困惑,如何使共享网络的信息/界面如此繁琐/难以获取,但是从WifiManager或Wifi类型的ConnectivityManager获取信息时却没有考虑到它:仅当不在网络共享中时,这一切才起作用.我实际上迷失于调查的那个分支.

我目前发现的最佳解决方案是使用标准Java NetworkInterface.getNetworkInterfaces(),而不是任何AndroID API.

从实验上看,AndroID似乎足够聪明,可以将与外部移动网络的网络接口设置为空广播.实际上,这很有意义,因为AndroID默默地丢弃涉及外部移动网络的UDP广播.

    // This works both in tethering and when connected to an Access Point    Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();    while (interfaces.hasMoreElements())     {        NetworkInterface networkInterface = interfaces.nextElement();        if (networkInterface.isLoopback())            continue; // Don't want to broadcast to the loopback interface        for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses())         {                InetAddress broadcast = interfaceAddress.getbroadcast();                // InetAddress ip = interfaceAddress.getAddress();                                  // interfaceAddress.getNetworkPrefixLength() is another way to express subnet mask                // AndroID seems smart enough to set to null broadcast to                //  the external mobile network. It makes sense since AndroID                //  silently drop UDP broadcasts involving external mobile network.                if (broadcast == null)                    continue;                ... // Use the broadcast                        }    }

至于子网掩码,可以将getNetworkPrefixLength()的结果强制转换为子网掩码.我直接使用getbroadcast(),因为那是我的最终目标.

该代码似乎不需要特殊的权限(不需要ACCESS_WIFI_STATE或NETWORK,只需INTERNET).

该代码段的主要参考:http://enigma2eureka.blogspot.it/2009/08/finding-your-ip-v4-broadcast-address.html

总结

以上是内存溢出为你收集整理的Java-Android,在网络共享和连接到接入点时检测WiFi的本地IP和子网掩码全部内容,希望文章能够帮你解决Java-Android,在网络共享和连接到接入点时检测WiFi的本地IP和子网掩码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1089065.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存