我如何指定在Android中通过哪个接口(Wifi或数据)发送UDP数据包?

我如何指定在Android中通过哪个接口(Wifi或数据)发送UDP数据包?,android,Android,我希望能够指定和约束发送UDP数据报的接口 我希望在不禁用“非通缉”接口的情况下执行此操作。假设标准INET连接在所选接口上可用(事实上,假设如果两个接口都处于活动状态,则INET连接在boti上可用) 如果启用Wifi接口,大多数移动设备将通过Wifi发送数据(优先于数据接口);但我想知道如何在语法上“强制”UDP通过我选择的接口 已经有类似的问题发布了,但没有一个问题能准确地触及主题。此外,我希望编程解决方案(一般或通过支持库)尽可能早地在Android SDK版本中提供 请注意,“Andr

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

我希望在不禁用“非通缉”接口的情况下执行此操作。假设标准INET连接在所选接口上可用(事实上,假设如果两个接口都处于活动状态,则INET连接在boti上可用)

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

已经有类似的问题发布了,但没有一个问题能准确地触及主题。此外,我希望编程解决方案(一般或通过支持库)尽可能早地在Android SDK版本中提供

请注意,“Android如何选择wifi网络接口发送udp数据包”这一问题很老,从未得到回答。

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

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

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

当WiFi不可用时,仅显示rmnet。类似地,当WiFi可用时,rmnet将不显示,即使移动数据已启用

添加于2017年5月30日事实上,我怀疑这是否可能达到您的目的,因为当WiFi可用时,移动网络似乎会自动关闭。

存在一个问题-如何确定与当前和未来所有设备的
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接口相关联

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

int localineaddress=wifiManager.getDhcpInfo().ipAddress;
ByteBuffer tmp=ByteBuffer.allocate(4);
tmp.putInt(本地地址);
字节交换;for(inti=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套接字=新的DatagramSocket(端口号、localInetAddress);
这对我有用

编辑:


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

因为getDhcpInfo()出现了一个小问题.ipAddress提供32位,因此与IPv6不兼容。但是,由于所有LAN当前都遵循IP4协议,因此这一点可能可以忽略。+1可以工作。在API级别25上进行了尝试。但进行了少量更正。地址以相反的方式分配,因此需要此
字节交换;for(int i=0;i<2;i++){swap=tmp.get(i);tmp.put(i,tmp.get(3-i));tmp.put(3-i,swap);Log.d(“WIFI_Y”,String.valueOf(tmp.get(i)))}
tmp.putInt之后
 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);