我试图为没有root的UDP数据包分配传出接口。
到目前为止,我已找到
IP_PKTINFO将修改源地址,但接口选择仍将基于路由表
SO_BINDTODEVICE可以使用但需要root
修改路由表,这将需要我没有的权限。
我在Solaris上找到了IP_NEXTHOP,但显然它不在Linux中。
任何想法?
答案 0 :(得分:0)
所以我在API级别22中找到了这个功能
void bindSocket(DatagramSocket socket)
将指定的DatagramSocket绑定到此网络。所有数据流量 套接字将在此网络上发送,无论如何 由bindProcessToNetwork(网络)设置的进程范围的网络绑定。该 套接字不得连接。
您使用此
请求网络void requestNetwork(NetworkRequest请求, PendingIntent操作)
请求网络满足一组NetworkCapabilities。这个 函数的行为与采用a的版本相同 NetworkCallback,而不是ConnectivityManager.NetworkCallback a 使用PendingIntent。这意味着请求可能比呼叫更长 应用程序,并在找到合适的网络时回叫。
该操作是进入广播接收器的Intent广播 你在registerReceiver(BroadcastReceiver, IntentFilter)或通过AndroidManifest.xml中的标记 文件
操作Intent附带两个附加功能,即网络类型 额外称为EXTRA_NETWORK和一个名为的额外的NetworkRequest 包含原始请求参数的EXTRA_NETWORK_REQUEST。它 创建一个新的ConnectivityManager.NetworkCallback非常重要 在完成Intent处理之前的基于请求 预留网络或在意图发布后不久发布 处理。
如果已经注册了此Intent请求(使用 由filterEquals(Intent)定义的两个Intent的相等,然后它会 被删除并替换为这个,有效地释放 以前的NetworkRequest。
请求可以通过调用正常释放 releaseNetworkRequest(android.app.PendingIntent)。
目前还不支持请求网络 这些是NET_CAPABILITY_VALIDATED或NET_CAPABILITY_CAPTIVE_PORTAL NetworkCapabilities表示特定网络可能的状态 永远不会达到,网络是否会达到这些状态 在启动网络之前未知,因此框架没有 知道如何满足具有这些功能的请求。
此方法要求调用者持有 CHANGE_NETWORK_STATE权限或修改系统的能力 由canWrite(上下文)确定的设置。
因此,如果您请求当前可用的网络,则可以将套接字绑定到该网络。