在没有root的linux / android上为UDP数据包分配传出接口

时间:2016-05-12 11:26:41

标签: android linux sockets routing

我试图为没有root的UDP数据包分配传出接口。

到目前为止,我已找到

  1. IP_PKTINFO将修改源地址,但接口选择仍将基于路由表

  2. SO_BINDTODEVICE可以使用但需要root

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

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

    任何想法?

1 个答案:

答案 0 :(得分:0)

所以我在API级别22中找到了这个功能

bindSocket

void bindSocket(DatagramSocket socket)

  

将指定的DatagramSocket绑定到此网络。所有数据流量   套接字将在此网络上发送,无论如何   由bindProcessToNetwork(网络)设置的进程范围的网络绑定。该   套接字不得连接。

您使用此

请求网络

requestNetwork

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(上下文)确定的设置。

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