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

adb命令 - adb forward交互流程

命令: 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].

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏个人翻译

在 Heroku 中部署 Node.js 应用

原文地址:https://dzone.com/articles/deploying-nodejs-on-heroku

25910
来自专栏holer

怎样从公网访问内网Oracle数据库

本地安装了Oracle数据库,只能在局域网内访问,怎样从公网也能访问本地Oracle数据库?

2061
来自专栏Java帮帮-微信公众号-技术文章全总结

redis 的安装和部署

安装 1.首先下载Redis压缩包 wget : http://download.redis.io/releases/redis-3.2.6.tar.gz 2...

3886
来自专栏java闲聊

Docker中redis镜像

Docker让环境安装十分快捷 ,直接运行下方的命令,docker镜像就成功启动,

2104
来自专栏云计算

在Heroku上部署Node.js

今天,我们将演示如何在Heroku上部署Node.js应用。Heroku官方提供免费帐户使用,在此之上,我们最多可以托管5个应用程序。但如果你有大量需求的话,就...

3888
来自专栏LanceToBigData

linux(十三)之磁盘分区、创建文件系统、挂载

前面学习了linux的用户管理 ,感觉是不是linux的多用户多任务的系统感觉十分了解了,但是其实并不然的。你还需要了解更多。接下来给大家分享的是 在vmwar...

35210
来自专栏V站

WIN7系统如何在本地(局域网)配置PHP环境?

安装完成后,点击控制面板->管理工具->Internet Information Services (IIS)管理器(注意不是那个什么6.0的)

3977
来自专栏软件

DevOps之Gitlab-Runner

背景 Gitlab-Runner是一款用于执行软件集成脚本的工具,它配合Gitlab-CI使用,是Gitlab代码管理工具的一部分。当软件工程师提交代码到Git...

2536
来自专栏张善友的专栏

超实用的8个Linux命令行性能监测工具

对每个系统/网络管理员来说,每天监测Linux系统性能是一项非常艰巨的任务。在IT业从事5年的Linux系统管理员后,我发现监控和保持系统正常运行真不是件容易的...

2165
来自专栏我爱吃花生

腾讯云镜像仓库实验记录

首先到github个人首页,浏览器地址栏红框位置为用户名(github可以通过用户名或者邮箱方式登录)

2591

扫码关注云+社区