我希望能够指定和约束UDP数据报将被发送的接口。
我想这样做而不会在物理上禁用"非通缉"接口。假设通过所选接口提供标准的INET连接(实际上假设如果两个接口都处于活动状态,那么通过boti可以获得INET连接)
如果启用了Wifi接口,大多数移动设备将通过Wifi(优先于数据接口)发送数据;但我想知道如何语法和#34;强迫" UDP在我选择的界面上。
已经发布了类似的问题,但毫无疑问可以准确地解决这个问题。此外,我希望编程的解决方案可用(通常或通过支持库)尽可能在Android SDK版本方面尽可能远。
请注意问题" Android如何选择wifi网络接口发送udp数据包"很老了,从来没有回答过。
答案 0 :(得分:3)
cyanide's answer存在问题 - 如何确定所有设备(当前和未来)与getName()
相关的有效WiFi接口值?
我提出的解决方案需要找到与WiFi接口关联的IP地址,然后获得一个绑定到该地址的UDP套接字。通过访问WiFiManager
:
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由WiFi接入点与WiFi接口相关联。
答案 1 :(得分:2)
使用 NetworkInterface.getNetworkInterfaces “获取所有活动接口的列表。
然后对于每个接口使用 NetworkInterface.getName 。对于wifi,它将是wlanXX(三星和其他),tiwlanXX(摩托罗拉),ethXX(HTC)和e0(黑莓)。使用移动网络肯定是rmnetXX。
然后您可以使用NetworkInterface.getInetAddrress创建套接字。
当WiFi不可用时,仅显示rmnet。同样,当WiFi可用时,即使启用了移动数据,也不会显示rmnet。
已添加30May17 事实上,我怀疑是否可以按照您的意图行事,因为当WiFi可用时,移动网络会自动关闭。
答案 2 :(得分:0)
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