Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15529573
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2009-04-28 11:45:32

浅析adb命令 - adb forward交互流程

《浅析adb创建流程》

命令:
adb forward tcp:6100 tcp:7100 // PC上所有6100端口通信数据将被重定向到手机端7100端口server上

或者
adb forward tcp:6100 local:logd //
PC上所有6100端口通信数据将被重定向到手机端UNIX类型socket上


通过adb forward我们可以接收手机端server[或者unix域socket]程序发出的所有数据,
并且可以用自己写的小程序向手机端server[或者unix域socket]发送我们自己的数据[luther.gliethttp]
表示在PC的HOST端创建一个server监听6100端口,pc上的其它应用程序,比如:A,可以以client身份和6100端口server建立连接,
之后A发送的所有数据将透明传递到手机端监听7100端口的一个应用程序,比如浏览器程序[luter.gliethttp].
代码流程如下:
1.在pc上执行adb forward tcp:6100 tcp:7100指令,该指令尝试连接5037端口,触发HOST回调函数ss_listener_event_func执行.
2.ss_listener_event_func将为该次连接创建一个local_socket,之后等待该local_socket数据[luther.gliethttp],
3.当local_socket数据,"host:forward:tcp:6100;tcp:7100",到来之后,将执行local_socket_event_func回调函数,读取数据之后交由smart_socket_enqueue==>handle_host_request
4.handle_host_request==>install_listener("tcp:6100", "tcp:7100", transport);
  创建server监听端口socket_loopback_server(6100, SOCK_STREAM);当有客户端连接该端口是执行listener_event_func回调函数
5.现在pc上我们写了一个自己的小应用程序B,和6100端口的server建立连接,于是HOST上的listener_event_func回调函数执行.
static void listener_event_func(int _fd, unsigned ev, void *_l)
{
    alistener *l = _l;
    asocket *s;

    if(ev & FDE_READ) {
        struct sockaddr addr;
        socklen_t alen;
        int fd;

        alen = sizeof(addr);
        fd = adb_socket_accept(_fd, &addr, &alen); // 首先接受该连接

        if(fd < 0) return;

        gliethttp_server = create_local_socket(fd); // 为我们的小应用程序建立维护对象gliethttp_server

        if(gliethttp_server) {
            gliethttp_server->transport = l->transport;
            connect_to_remote(gliethttp_server, l->connect_to); // 发送"tcp:7100"到手机端,手机端将建立一个与7100端口server链接的gliethttp_client,作为

                                                 // 与HOST这里建立的gliethttp_server对象进行数据传输的手机端程序[luther.gliethttp]

                                                 // 如果成功连接之后,手机端adbd将返回"OKAY",进而gliethttp_server和gliethttp_client将绑定在一起

                                                 // gliethttp_server发送的数据将通过HOST的daemon直接传递给gliethttp_client

                                                 // gliethttp_client数据将通过手机的adbd直接发送给HOST的gliethttp_server,然后传递给我们的小程序B[lutehr.gliethttp]

            return;
        }

        adb_close(fd);
    }
}
void connect_to_remote(asocket *s, const char *destination)
{
    D("Connect_to_remote call \n");
    apacket *p = get_apacket();
    int len = strlen(destination) + 1;

    if(len > (MAX_PAYLOAD-1)) {
        fatal("destination oversized");
    }

    D("LS(%d): connect('%s')\n", s->id, destination);
    p->msg.command = A_OPEN; // 打开手机端"tcp:7100"端口

    p->msg.arg0 = s->id;
    p->msg.data_length = len;
    strcpy((char*) p->data, destination);
    send_packet(p, s->transport);
}
在手机端
output_thread线程将接收到的数据传递给t->transport_socket句柄,该句柄将调用transport_socket_events==>handle_packet
回调函数进一步处理我们的"tcp:7100"命令.
handle_packet==>
gliethttp_client = create_local_service_socket("tcp:7100");创建维护对象gliethttp_client,
进一步执行socket_loopback_client("7100", SOCK_STREAM);尝试打开手机端的7100端口(这时手机端应该已经打开监听7100端口的server程序)[luther.gliethttp].
之后create_remote_socket(p->msg.arg0, t);表示gliethttp_client从手机端7100端口server上接收到的数据将全部传递给
HOST端的gliethttp_server端口,进而传递给我们的小程序B[luther.gliethttp].

阅读(20702) | 评论(4) | 转发(1) |
给主人留下些什么吧!~~

KeMu16362014-08-01 18:44:57

楼主我想在嵌入式系统上(比如wince、qnx等等)上实现一套ADB Server的逻辑与Android手机的adbd通信(比如实现adb forward类似的功能),不知道这个有没有可能实现,如果能够实现的话工作量有多大?如果楼主能够给予一些提示的话,感激不尽。

chinaunix网友2010-09-16 13:30:04

博主你好,我做了一个实验, 在手机端开了一个serversocket,监听8765端口 \Android\android-sdk_r06-windows\android-sdk-windows\tools>adb shell netstat oto Recv-Q Send-Q Local Address Foreign Address State p 0 0 127.0.0.1:5037 0.0.0.0:* LISTEN p 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN p 0 0 0.0.0.0:8765 0.0.0.0:* LISTEN p 0 0 10.0.2.15:5555 10.0.2.2:1295 ESTABLISHED 使用adb fo

gliethttp2010-07-24 11:20:56

这句不是在手机端创建7100端口的server,这不是ssh -CfNg -R 方式端口转发,而是类似ssh -CfNg -L方式,在执行adb forward tcp:6100 tcp:7100之前,7100端口的server应该已经在手机运行

chinaunix网友2010-07-21 18:29:52

博主你好,我做了一个实验,使用adb forward tcp:6100 tcp:7100,然后adb shell netstat,并没有发现7100处于监听状态,这是为什么呢?