Android棒棒糖将套接字绑定到特定网络。DatagramSocket呢?

Android棒棒糖将套接字绑定到特定网络。DatagramSocket呢?,android,sockets,networking,bind,Android,Sockets,Networking,Bind,我可以将套接字绑定到android 5.x中的特定网络。 如何绑定DatagramSocket?可能吗? 寻找资料来源,如果它可以做的反射没有运气。 更新ParcelFileDescriptor.fromDatagramSocket(socket).getFd()可以替换帮助函数getFileDescriptor。还有一个新函数可以直接绑定到API 23中的FileDescriptor 更新:刚刚在API级别22中看到一些灰色的附加新函数。 更新:也可以通过API级别21中的反射来完成 p

我可以将套接字绑定到android 5.x中的特定网络。 如何绑定DatagramSocket?可能吗? 寻找资料来源,如果它可以做的反射没有运气。

更新ParcelFileDescriptor.fromDatagramSocket(socket).getFd()可以替换帮助函数getFileDescriptor。还有一个新函数可以直接绑定到API 23中的FileDescriptor

更新:刚刚在API级别22中看到一些灰色的附加新函数。

更新:也可以通过API级别21中的反射来完成

private static int getFileDescriptor(DatagramSocket套接字)抛出SocketException{
试一试{
字段implField=DatagramSocket.class.getDeclaredField(“impl”);
implField.setAccessible(true);
DatagramSocketImpl implValue=(DatagramSocketImpl)implField.get(socket);
字段fdField=DatagramSocketImpl.class.getDeclaredField(“fd”);
fdField.setAccessible(true);
FileDescriptor fdValue=(FileDescriptor)fdField.get(implValue);
Field descField=FileDescriptor.class.getDeclaredField(“描述符”);
descField.setAccessible(true);
返回(整数)descField.get(fdValue);
}捕获(无此字段例外){
e、 printStackTrace();
抛出新断言错误(e);
}捕获(非法访问例外e){
e、 printStackTrace();
抛出新断言错误(e);
}
}
专用DatagramChannel createDatagramChannel(网络activeWifiNetwork)引发IOException{
DatagramChannel=DatagramChannel.open();
试一试{
如果(activeWifiNetwork==null){
Log.d(标记“无需绑定的活动网络”);
返回通道;
}
Class networkUtils=Class.forName(“android.net.networkUtils”);
对于(方法m:networkUtils.getDeclaredMethods()){
if(m.getName().equalsIgnoreCase(“bindsockettonework”)){
DatagramSocket套接字=channel.socket();
socket.getReuseAddress();
int-socketFileDescriptor=getFileDescriptor(套接字);
int result=(Integer)m.invoke(null,socketFileDescriptor,Integer.valueOf(activeWifiNetwork.toString());
Log.d(标签,“将数据报绑定到网络的结果为”+结果);
如果(结果!=0){
抛出新异常(“将套接字绑定到网络时出错”);
}
打破
}
}
}捕获(例外情况除外){
例如printStackTrace();
}
返回通道;

}
您是否尝试将getFileDescriptor()替换为
ParcelFileDescriptor.fromDatagramSocket(socket).getFd()
?您是对的。它可以被替换。谢谢还发现这一个存在于23个正确的。但是仍然需要createDatagramChannel()将DatagramSocket绑定到API 21上的网络,因为API 22上提供了
bindSocket(DatagramSocket)