以Android API 30为目标时无法绑定()netlink套接字

以Android API 30为目标时无法绑定()netlink套接字,android,android-ndk,netlink,Android,Android Ndk,Netlink,我使用以下工具创建netlink套接字已有相当一段时间了: NetLinkLocalNetworkInfo::NetLinkSocket::NetLinkSocket() : fd(0) { fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if(fd < 0) { throw std::runtime_error("Failed to create NetLink socket"

我使用以下工具创建netlink套接字已有相当一段时间了:

NetLinkLocalNetworkInfo::NetLinkSocket::NetLinkSocket() :
fd(0)
{
    fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
    if(fd < 0)
    {
        throw std::runtime_error("Failed to create NetLink socket");
    }

    struct sockaddr_nl addr;
    memset(&addr, 0, sizeof(addr));
    addr.nl_family = AF_NETLINK;

    int err = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
    if(err < 0)
    {
        close(fd);
        throw std::runtime_error("Failed to bind NetLink socket");
    }
}
NetLinkLocalNetworkInfo::NetLinkSocket::NetLinkSocket():
fd(0)
{
fd=套接字(PF_网络链路、SOCK_原始、网络链路_路由);
如果(fd<0)
{
抛出std::runtime_错误(“未能创建NetLink套接字”);
}
结构sockaddr_nl addr;
memset(&addr,0,sizeof(addr));
addr.nl_family=AF_NETLINK;
int err=bind(fd,(struct sockaddr*)&addr,sizeof(addr));
如果(误差<0)
{
关闭(fd);
抛出std::runtime_错误(“绑定NetLink套接字失败”);
}
}
这在我们已经准备好的网络逻辑的一部分中使用,以使用。当以API 30为目标时,对
bind
的调用现在返回-1,
errno
为“权限被拒绝”

针对API 30的应用程序行为的改变现在意味着
bind()
是一个受限调用。(谷歌开发者页面上的某个地方有一个文档,但如果我能再次找到它,我会很生气。它曾经存在,但自从我几个月前第一次遇到这个问题以来,这个页面已经发生了变化。)这应该会影响所有针对API 30的应用,但我发现只有针对API 30的应用才能在设备上运行(物理或模拟器)运行Android 11会受到影响。当我第一次遇到这篇文章时,我的笔记中也提到了建议使用的文章,但这需要找到某种方法将信息传递到本机代码,或者通过JNI将本机代码调用到Android平台代码中。如果必须这样做,我对其中任何一种都没有意见n、 但我想知道是否还有另一个我不知道的选择

我也看到了,但在其中一个答案中有一个链接表明它应该是可能的,至少在API 30之前是可能的


现在我们不允许调用
bind()
,还有其他可用选项吗?

找到了解决方案。原来我们使用NetLink套接字来发现网络接口地址信息,因为
IFADRS
不可用(或者,没有完全实现,或者诸如此类的东西——这里没有人能确切记得我们为什么不能使用它)当时在Android上。从API 24开始,
ifaddrs
现在可用。我们将实现切换为使用
ifaddrs
。只要您的最低支持版本是API 24或更高版本,您就可以这样做。

如果您没有该调用,为什么要绑定?将套接字
fd
绑定到sockaddr\u nl
addr
但是为什么?我从来没有绑定过套接字。你会如何收集设备网络接口的信息?我真的不记得我们为什么要这样做。自从5年前我们实现它以来,情况就是这样。如果你有不同的方法,我愿意接受建议。