2016-05-12 74 views
0

我正在尝试为没有超级用户的UDP数据包分配出站接口。在没有root的linux/android上为UDP数据包分配出站接口

到目前为止,我发现

  1. IP_PKTINFO将修改源地址,但接口的选择仍然会根据路由表

  2. SO_BINDTODEVICE将工作,但需要root

  3. 修改路由表,这将需要权限我没有。

我在Solaris上找到了IP_NEXTHOP,但显然它不在Linux中。

有什么想法?

回答

0

所以我在API级别22

bindSocket

无效bindSocket(DatagramSocket类插座)

绑定在指定的DatagramSocket这个网络发现这个功能。无论通过bindProcessToNetwork(Network)设置的任何 进程范围的网络绑定,套接字上的所有数据通信量将被发送到此网络上。 插座不能连接。

您使用此

requestNetwork

空隙requestNetwork(NetworkRequest请求, 的PendingIntent操作)

请求的网络,以满足一组NetworkCapabilities的请求网络。此 函数的行为与采用NetworkCallback的版本相同,但使用的是PendingIntent而不是ConnectivityManager.NetworkCallback 。这意味着请求可能会比呼叫 应用程序长,并且在找到合适的网络时会被回叫。

操作是希望播出去,你有registerReceiver(广播接收器, 的IntentFilter)注册的广播接收器 或通过标签在AndroidManifest.xml中 文件

操作意图有两个交付额外的网络类型 额外的称为EXTRA_NETWORK和网络请求类型的额外称为 EXTRA_NETWORK_REQUEST包含原始请求参数。它在创建新的基于ConnectivityManager.NetworkCallback 的请求之前非常重要,它可以在完成处理意向到 之前保留网络,或者在Intent处理完 后不久发布。

如果已经有此意图注册的请求(通过filterEquals定义的 平等两个目的的(意向)),那么它会 可以通过这一个移除和更换,从而有效地释放以前 NetworkRequest。

通过调用 releaseNetworkRequest(android.app.PendingIntent),可以正常释放该请求。

它是目前不支持请求网络与任一 NET_CAPABILITY_VALIDATED或NET_CAPABILITY_CAPTIVE_PORTAL因为这些 NetworkCapabilities表示一个特定网络可以 从未达到状态,并且网络将达到这些状态是否是造就了网络 之前未知所以框架并不知道如何去满足具有这些能力的请求。

该方法要求调用者保存由canWrite(Context)确定的设置CHANGE_NETWORK_STATE权限或修改系统 设置的能力。

因此,如果您请求的网络当前可用,您可以将一个套接字绑定到它。