首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为linux/android上无根用户的UDP数据包分配输出接口

问为linux/android上无根用户的UDP数据包分配输出接口
EN

Stack Overflow用户
提问于 2016-05-12 11:26:40
回答 1查看 386关注 0票数 0

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

到目前为止我发现

  1. IP_PKTINFO将修改源地址,但接口选择仍将基于路由表。
  2. SO_BINDTODEVICE,它可以工作,但需要根
  3. 对路由表的修改,这将需要我没有的权限。

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

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-19 14:45:26

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

bindSocket

空bindSocket (DatagramSocket套接字)

将指定的DatagramSocket绑定到此网络。套接字上的所有数据通信将在此网络上发送,而不管bindProcessToNetwork(网络)设置的任何进程范围的网络绑定。插座不能连接。

您使用以下方法请求网络

requestNetwork

void requestNetwork (NetworkRequest请求,PendingIntent操作)

请求网络以满足一组NetworkCapabilities。此函数的行为与接受NetworkCallback的版本相同,但使用的不是ConnectivityManager.NetworkCallback,而是PendingIntent。这意味着请求可能比调用应用程序更长,并在找到合适的网络时被调用。 该操作是一个意图广播,它将发送到您在registerReceiver(BroadcastReceiver,IntentFilter)或通过AndroidManifest.xml文件中的标记注册的广播接收器。 操作意图是通过两个附加程序传递的,一个网络类型的额外称为EXTRA_NETWORK,另一个称为NetworkRequest类型的额外,称为EXTRA_NETWORK_REQUEST,包含原始请求参数。在完成对保留网络的意图的处理之前,创建一个基于ConnectivityManager.NetworkCallback的新请求非常重要,否则它将在处理完后不久发布。 如果已经注册了对此意图的请求(与filterEquals(意图)定义的两个意图相等),那么它将被移除并替换,从而有效地释放以前的NetworkRequest。 请求可以通过调用releaseNetworkRequest(android.app.PendingIntent).来正常释放 目前不支持使用NET_CAPABILITY_VALIDATED或NET_CAPABILITY_CAPTIVE_PORTAL请求网络,因为这些NetworkCapabilities表示特定网络可能永远无法达到的状态,并且在提出网络之前还不知道网络是否会达到这些状态,因此框架不知道如何用这些功能来满足请求。 此方法要求调用方持有CHANGE_NETWORK_STATE权限或canWrite(上下文)确定的修改系统设置的能力。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37185520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档