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
].
adb forward交互流程的更多相关文章
- javaweb 与jsp页面的交互流程 (初次接触时写)
javaweb 与jsp页面的交互流程 javaweb项目目录 1. javaweb项目的一般目录: 2. jsp 页面一般情况下放在 top(前台页面) back(后台页面) 3. 后台代码 放在s ...
- 深入浅出 Redis client/server交互流程
综述 最近笔者阅读并研究redis源码,在redis客户端与服务器端交互这个内容点上,需要参考网上一些文章,但是遗憾的是发现大部分文章都断断续续的非系统性的,不能给读者此交互流程的整体把握.所以这里我 ...
- 关于AJAX 的交互模型、交互流程及代码示范
AJAX = 异步JavaScript + XML. 它是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况 ...
- 软件测试面试必问--bug交互流程
目前市场主要用的bug管理工具:禅道.jira.QC.bugfree等,当然也有自己公司开发的. 不过不管哪一种工具,核心交互流程都是差不多的,只是字段的名称不一样而已,参考如下两张示意图: 这是前几 ...
- coTurn 运行在Windows平台的方法及服务与客户端运行交互流程和原理
coTurn是一个开源的STUN和TURN及ICE服务项目,只是不支持Windows.为了在window平台上使用coTurn源码,需要在windows平台下安装Cygwin环境,并编译coTurn源 ...
- bing背单词交互流程 - Chongyang Bai
昨天和travis,钟秋开会确认了bing背单词的手机界面交互流程.我在这里简单描述一下,设计页面暂时不能贴出来,期待大家的宝贵意见 b( ̄▽ ̄)d. 单词本浏览界面:单词本被分为两类,用户单词本和单 ...
- 170621 - Android ADB forward端口映射和reverse反向代理 使用笔记
个人理解 forward:端口映射 将本地PC指定Port端口,映射到设备手机指定Port端口上.以便解决 PC -> Phone 的访问问题PC 作为Client客户端 可以任意访问 Phon ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-3.微信Oauth2.0交互流程讲解
笔记 3.微信Oauth2.0交互流程讲解 简介:讲解微信Oauth2.0交互流程 参考:https://open.weixin.qq.com/cgi-bin/sho ...
- JAVAEE 和项目开发(第二课:HTTP协议的特点和交互流程)
HTTP 的概念和介绍 概念:超文本传输协议(Hyper Text Transfer Protocol) 作用:规范了浏览器和服务器的数据交互 特点: 简单快速:客户向服务器请求服务时,只需传送请求方 ...
随机推荐
- 本地git库gitlab库链接服务器库 idea git 配置 gitlab 配置 git生成ssh公钥
下载git https://git-scm.com/ 安装以后会右键菜单出现Git Base Here 点击Git Base Here 输入 cd ~ 进入你的用户根目录 创建文件夹 mkdir ...
- Pitch,Yaw,Roll的概念
在航空中,pitch, yaw, roll下图所示. pitch是围绕X轴旋转,也叫做俯仰角. yaw是围绕Y轴旋转,也叫偏航角. roll是围绕Z轴旋转,也叫翻滚角. 在3D系统中,假设视点 ...
- Asp.Net 控件 GridView
这两天做的作业都得用到visual studio 越来越发现其功能真心强大 前几天Asp.Net做了个界面增删查改的作业(连接数据库),用到了个组件GridView,感觉很强大 在这里小结一下(这里主 ...
- HTML中的转义字符 (转)
HTML中<, >,&等有特殊含义,(前两个字符用于链接签,&用于转义),不能直接使用.使用这三个字符时,应使用它们的转义序列,如下所示: & 或 & &a ...
- CSS-页面滑屏滚动原理
现在的网站有的时候为了简洁就是很多的单页滑屏滚动介绍,主要呈现方式有两种,一种是整体的元素一直排列下去,假设有五个需要展示的全屏页面,那么高度是500%,只是展示100%,剩下的可以通过transfo ...
- [总结]Jquery api 快速参考
选择符 匹配 * 所有元素 #id 带有给定ID的元素 element 给定类型的所有元素,比如说html标签 .class 带有给定类的所有元素 a,b 匹配a或者匹配b的元素 a b 作为a后代的 ...
- 大数据开发实战:Stream SQL实时开发二
1.介绍 本节主要利用Stream SQL进行实时开发实战,回顾Beam的API和Hadoop MapReduce的API,会发现Google将实际业务对数据的各种操作进行了抽象,多变的数据需求抽象为 ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十六)Structured Streaming:WARN clients.NetworkClient: Error while fetching metadata with correlation id 1 : {my-topic=LEADER_NOT_AVAILABLE}
问题描述: 我之前使用kafka的命令删除了改topic: ./kafka-topics.sh --delete --zookeeper [zookeeper server] --topic [to ...
- RibbonControl中的主题设计
Ribbon+扁平化 据调查,其实人们可能最多只用到全部 Office 功能的 5%,为此,微软交互式团队推出了Ribbon风格,一时间,很多软件升级后都换成了Ribbon界面:扁平化其实不是新东西, ...
- MySql 分区 分库 分表
ubuntu下MySQL配置和管理:http://www.2cto.com/database/201306/222510.html mysql分表,分区的区别和联系:http://my.oschina ...