无法连接到本地本地套接字在Android 5.1 [英] Cannot connect to native local socket on android 5.1

查看:3812
本文介绍了无法连接到本地本地套接字在Android 5.1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经commad行工具,它发送广播,并等待结果。

I have commad-line tool, which sends broadcast and wait result.

服务器code(省略处理错误):

Server code (error handling omitted):

    int makeAddr(const char* name, struct sockaddr_un* pAddr, socklen_t* pSockLen)
    {
        int nameLen = strlen(name);
        pAddr->sun_path[0] = '\0';
        strcpy(pAddr->sun_path+1, name);
        pAddr->sun_family = AF_LOCAL;
        *pSockLen = 1 + nameLen + offsetof(struct sockaddr_un, sun_path);
        return 0;
    }

    int main(int argc, char* argv[])
    {
        //...

        // Create socket in abstract namespace
        struct sockaddr_un sockAddr = {0};
        socklen_t sockLen;
        makeAddr("SOCKET_NAME", &sockAddr, &sockLen);

        int serverFd = socket(AF_LOCAL, SOCK_STREAM, PF_UNIX));

        bind(serverFd, (const struct sockaddr*) &sockAddr, sockLen);

        listen(serverFd, 5);

        //set socket non-blocking
        int flags = fcntl(serverFd, F_GETFL, 0);
        fcntl(serverFd, F_SETFL, flags | O_NONBLOCK);

        pollfd pollFd = {0};
        pollFd.fd = serverFd;
        pollFd.events = POLLIN | POLLRDHUP;

        // Send brodcast 
        system("am broadcast ...");

        for(;;)
        {
            // Wait result 
            int pollResult = poll(&pollFd, 1, timeout);
        // Process result

Java客户端code:

Java client code:

public class CommandReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {

            LocalSocket socket = new LocalSocket();
            LocalSocketAddress address = new LocalSocketAddress("SOCKET_NAME", LocalSocketAddress.Namespace.ABSTRACT);
            socket.connect(address);

            // Do something and send result asynchronously 

它所有的工作在Android 5.1之前

It all works on android prior 5.1.

在Android 5.1连接()抛出异常:

On android 5.1 connect() throws exception:

java.io.IOException异常:权限被拒绝。

java.io.IOException: Permission denied

在android.net.LocalSocketImpl.connectLocal(本机方法)

at android.net.LocalSocketImpl.connectLocal(Native Method)

在android.net.LocalSocketImpl.connect(LocalSocketImpl.java:290)

at android.net.LocalSocketImpl.connect(LocalSocketImpl.java:290)

在android.net.LocalSocket.connect(LocalSocket.java:130)

at android.net.LocalSocket.connect(LocalSocket.java:130)

在日志中出现错误:

九月7日至27日:56:08.179:W:类型= 1400g审计(0.0:3675):AVC:否认{} connectto为path=00636F6D2E6B6173706572736B792E6B617368656C6C2E534F434B45542D36313838363731373231343337393833373637 scontext = U:R:untrusted_app:S0 tcontext = U:R:外壳:S0 = tclass许可unix_stream_socket = 0

07-27 09:56:08.179: W: type=1400 audit(0.0:3675): avc: denied { connectto } for path=00636F6D2E6B6173706572736B792E6B617368656C6C2E534F434B45542D36313838363731373231343337393833373637 scontext=u:r:untrusted_app:s0 tcontext=u:r:shell:s0 tclass=unix_stream_socket permissive=0

我找到了相对的android修复:
https://android.googlesource.com/device/moto/shamu/+/b2db40f

I've found relative android fix: https://android.googlesource.com/device/moto/shamu/+/b2db40f

因此​​,它不会再由于Android 5.1的工作?
我能做些什么(也许设置权限以某种方式)?
或者有另一种机制发送从本地命令行工具的数据,并等待结果呢?

So, it will not work anymore since android 5.1? What can I do (maybe set permission somehow)? Or is there another mechanism to send data from native command-line tool and wait result?

推荐答案

使用管道,而不是插座:
O_RDWR与民调命名管道()

Use pipes instead of socket: O_RDWR on named pipes with poll()

在java进程创建管道:

Create pipe in java process:

        mkfifo(cpath, 0);
        chmod(cpath, S_IRWXU|S_IROTH|S_IRGRP);

在本机进程打开管道:

int serverFd = open(PIPE_NAME, O_RDONLY | O_NONBLOCK);
pollfd pollFd = {0};
pollFd.fd = serverFd.get();
pollFd.events = POLLIN | POLLRDHUP;

// send command
....

for(;;)
{
    int pollResult = poll(&pollFd, 1, timeout);

这篇关于无法连接到本地本地套接字在Android 5.1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆