我希望能够指定和约束发送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 传输