连接到抽象unix套接字时'权限被拒绝'

时间:2015-12-01 11:37:58

标签: android sockets permissions

操作系统:Android L
服务器:本机级系统服务器,通过抽象套接字提供服务 客户:jni在正常的第3个APK 获得“拒绝许可”#39;使用APK连接套接字时。
我以为抽象套接字没有权限

并且,在adb shell(rooted shell)中运行时,相同的代码也可以工作。

问题是:在哪里设置权限

代码:

char *target_socket_name = "@mobilelogd"; 
int sock_id = 0; 
struct sockaddr_un sun;
int address_len;

sock_id = socket(AF_UNIX, SOCK_STREAM, 0);

if (sock_id < 0) {
    LOG("in %s: Unable to create socket: %s\n", __func__, strerror(errno));
    return -1;
} else {
    LOG("socket created!\n");       
}
memset(&sun, 0, sizeof(sun));
sun.sun_family = AF_UNIX;
strncpy(sun.sun_path, target_socket_name, strlen(target_socket_name));
sun.sun_path[0] = 0;
address_len = offsetof(struct sockaddr_un, sun_path) + strlen(target_socket_name);

if (connect(sock_id, (struct sockaddr *)&sun, address_len) == -1) 
{
    LOG("in %s: Connect to socket failed: (%d),%s\n", __func__, errno, strerror(errno));
    close(sock_id);
    return -1;
}

---编辑1 --- :添加一些初始化代码,然后更改&#39; 0&#39;相同的结果。

2 个答案:

答案 0 :(得分:1)

好的,这是由于引入了一个错误而在L上改变的独家新闻......错误修复就是管道:

https://android.googlesource.com/device/moto/shamu/+/b2db40f

而不是java管道或本机管道

答案 1 :(得分:0)

由于Android操纵了Linux内核并向其添加了How do I get mlocate to only index certain directories?,因此您应该将以下权限添加到清单文件中。

<uses-permission android:name="android.permission.INTERNET" /> 
  

Android为Linux内核添加了一个“偏执网络”选项,根据调用进程的组,它限制了对某些网络功能的访问。

因此,您的应用uid(用户ID;每个应用在安装后分配了唯一的uid)必须被授予该权限才能执行网络任务。