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

时间:2017-05-19 10:22:20

标签: android

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

我想这样做而不会在物理上禁用"非通缉"接口。假设通过所选接口提供标准的INET连接(实际上假设如果两个接口都处于活动状态,那么通过boti可以获得INET连接)

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

已经发布了类似的问题,但毫无疑问可以准确地解决这个问题。此外,我希望编程的解决方案可用(通常或通过支持库)尽可能在Android SDK版本方面尽可能远。

请注意问题" Android如何选择wifi网络接口发送udp数据包"很老了,从来没有回答过。

3 个答案:

答案 0 :(得分:3)

cyanide's answer存在问题 - 如何确定所有设备(当前和未来)与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由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