如何指定在Android中发送UDP数据包的接口(Wifi或数据)



我希望能够指定和约束发送UDP数据报的接口。

我想在不物理禁用"不需要"界面的情况下执行此操作。假设标准 INET 连接在所选接口上可用(实际上假设如果两个接口都处于活动状态,则 INET 连接可通过 boti 使用(

如果启用了 Wifi 接口,大多数移动设备将通过 Wifi(优先于数据接口(发送数据;但我想知道如何在语法上"强制"通过我选择的接口的 UDP。

已经发布了类似的问题,但没有问题准确地击中主题。此外,我希望编程解决方案在Android SDK版本方面尽可能(通常或通过支持库(可用。

请注意,"Android如何选择wifi网络接口发送udp数据包"的问题很旧,从未得到解答。

化物的答案存在一个问题 - 如何确定与当前和未来所有设备的getName()相关的有效WiFi接口值?

我想出的解决方案需要找到与WiFi接口关联的IP地址,然后获得绑定到该地址的UDP套接字。通过访问WiFiManager可以处理WiFi接口:

 WifiManager wifiManager =
                (WifiManager) context.getApplicationContext ()
                        .getSystemService (Context.WIFI_SERVICE);
.....
 int localInetAddressInt = wifiManager.getDhcpInfo ().ipAddress;
 ByteBuffer tmp = ByteBuffer.allocate (4);
 tmp.putInt (localInetAddressInt);
 InetAddress localInetAddress = InetAddress.getByAddress (tmp.array ());
 DatagramSocket socket = new DatagramSocket (portNumber, localInetAddress);

然后,当通过DatagramSocket(套接字(发送时,设备应通过适当的接口(即与绑定IP地址关联的接口,即IP地址绑定的WiFi接口(路由数据报。IP 地址通常由 WiFi 接入点通过 DHCP 与 WiFi 接口相关联。

使用 NetworkInterface.getNetworkInterfaces" 获取所有活动接口的列表。

然后对于每个接口,请使用 NetworkInterface.getName。对于wifi,它将是wlanXX(三星和其他(,tiwlanXX(摩托罗拉(,ethXX(HTC(和e0(黑莓(。对于移动网络,它肯定是rmnetXX。

然后你可以使用NetworkInterface.getInetAddrress来创建套接字。

当 WiFi 不可用时,仅显示 rmnet。同样,当 WiFi 可用时,即使启用了移动数据,也不会显示 rmnet。

添加 30May17 事实上,我怀疑这是否有可能按照您的意图做,因为看起来当 WiFi 可用时移动网络会自动关闭。

WifiManager wifiManager =
            (WifiManager) context.getApplicationContext ()
                    .getSystemService (Context.WIFI_SERVICE);

.....

 int localInetAddressInt = wifiManager.getDhcpInfo ().ipAddress;
 ByteBuffer tmp = ByteBuffer.allocate (4);
 tmp.putInt (localInetAddressInt);
byte swap; for(int i = 0; i < 2; i++) { swap = tmp.get(i); tmp.put(i, tmp.get(3 - i)); tmp.put(3 - i, swap);  }
 InetAddress localInetAddress = InetAddress.getByAddress (tmp.array ());
 DatagramSocket socket = new DatagramSocket (portNumber, localInetAddress);

这对我有用!

编辑:

不,它没有。当移动数据处于打开状态时,它不会通过 WIFI 传输

最新更新