Android localsocket与native的通信

最近在做Android层与native的localsocket通信,我看到Android Framework下LocalSocketServer有两种构造函数,之前在网上看到的例子都是修改init.rc,然后传fd进去。我感觉这种有点复杂,不如使用另外一种构造方法传String name进去。不过要注意,命名空间在C语言实现要注意。

 /**
     * Crewates a new server socket listening at specified name.
     * On the Android platform, the name is created in the Linux
     * abstract namespace (instead of on the filesystem).
     *
     * @param name address for socket
     * @throws IOException
     */
//注意这里的参数name只能是namespace,不能是file
    public LocalServerSocket(String name) throws IOException
    {
        impl = new LocalSocketImpl();

        impl.create(LocalSocket.SOCKET_STREAM);

        localAddress = new LocalSocketAddress(name);
        impl.bind(localAddress);

        impl.listen(LISTEN_BACKLOG);
    }

    /**
     * Create a LocalServerSocket from a file descriptor that's already
     * been created and bound. listen() will be called immediately on it.
     * Used for cases where file descriptors are passed in via environment
     * variables
     *
     * @param fd bound file descriptor
     * @throws IOException
     */
    public LocalServerSocket(FileDescriptor fd) throws IOException
    {
        impl = new LocalSocketImpl(fd);
        impl.listen(LISTEN_BACKLOG);
        localAddress = impl.getSockAddress();
    }


在C语言中,使用namespace应注意:

localsocket通信命名方式有两种。
一是普通的命名,socket会根据此命名创建一个同名的socket文件,客户端连接的时候通过读取该socket文件连接到socket服务端。这种方式的弊端是服务端必须对socket文件的路径具备写权限,客户端必须知道socket文件路径,且必须对该路径有读权限。
另外一种命名方式是抽象命名空间,这种方式不需要创建socket文件,只需要命名一个全局名字,即可让客户端根据此名字进行连接。后者的实现过程与前者的差别是,后者在对地址结构成员sun_path数组赋值的时候,必须把第一个字节置0,即sun_path[0] = 0

之前使用的一直的绝对路径的文件,而这种Android framework层没有响应的构造函数,所以也就一直出错。

然后修改成namespace一下就成功了。



你可能感兴趣的:(Android学习,C/C++语言)