zoukankan      html  css  js  c++  java
  • RIL层传输的方式就是socket

    前几天补习了一下Linux下的c编程,今天重新理一下RIL.java与rild之间的通信。

    在RIL.java的RILReceiver类中,有一个LocalSocket,这个就是传输的套接字。

    外部调用的函数应该是send,然后跟到RILSender类的EVENT_SEND,有个LocalSocket对象,但发送的方式是s.getOutputStream.write(dataLength);和s.getOutputStream().write(data);这马上让我联想到应该是用了文件描述符。

    现在,先找到对应的文件描述符。

    自然的,在LocalSocket类中找到方法getOutputStream(),发现其执行的是implCreateIfNeeded();和impl.getOutputStream();

    细看

    implCreateIfNeeded() -> impl.create(true);

    private LocalSocketImpl impl;

    查看LocalSocketImpl类中的create方法和getOutputStream方法。

    create -> fd = create_native(stream);

    getOutputStream -> return fos = new SocketOutputStream();

    最终查看SocketOutputStream的write方法

    FileDescriptor myFd = fd;

    writeba_native(b, off, len, myFd);

    好,到目前为止,我们都在java代码上,现在应该看看native代码了,

    查看frameworks/base/core/jni/android_net_LocalSocketImpl.cpp中create_native和writeba_native对应的函数

    static jobject socket_create(JNIEnv *env, jobject object, jboolean stream){

        ret = socket(PF_LOCAL, stream ? SOCK_STREAM : SOCK_DGRAM, 0);

        return jniCreateFileDescriptor(env, ret);

    }

    static void socket_writeba(JNIEnv *env, jobject object, jbyteArray buffer, jint off, jint len, jobject fileDescriptor){

        fd = jniGetFDFromFileDescriptor(env, fileDescriptor);

     err = socket_write_all(env, object, fd, byteBuffer + off, len);         ----------->   sendmsg(fd, &msg, MSG_NOSIGNAL);

    }

    注意上面加红加粗的代码socket,即RIL层传输的方式就是socket。

    man sendmsg:

    send a message on a socket

  • 相关阅读:
    使用openURL实现程序间带参数跳转详解
    [翻译] DFCircleActivityIndicator DF圆形活动状态指示器
    ABC定制视图导航控制器
    [翻译] UIView-draggable 可拖拽的UIView
    [翻译] SFRoundProgressCounterView 带有进度显示的倒计时视图
    [翻译] ColourClock 将时间值转换成背景色
    Solr部署如何启动
    搜索引擎基本工作原理
    面试题 IQ
    解释一下,在你往浏览器中输入一个URL后都发生了什么,要尽可能详细
  • 原文地址:https://www.cnblogs.com/jimwind/p/2864853.html
Copyright © 2011-2022 走看看