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) 作用:规范了浏览器和服务器的数据交互 特点: 简单快速:客户向服务器请求服务时,只需传送请求方 ...
随机推荐
- 8Manage PMP 项目管理工具
范围与需求管理 8Manage 项目管理平台提供先进的机制集中管理项目的范围与需求: 提供需求申请功能:获取,过滤,解析和明确项目的需求 提供需求矩阵功能:整理分析需求并跟踪需求从开始到完成的整个过程 ...
- libcurl HTTP POST请求向服务器发送json数据【转】
转载:http://blog.csdn.net/dgyanyong/article/details/14166217 转载:http://blog.csdn.net/th_gsb/article/de ...
- DevExpress ChartControl 柱状图的使用【转】
//中心业务平台的“热门岗位信息监测”柱状图 public partial class HotJobInfo : UserControl { private object _o ...
- Asp.net WebAPi Restful 的实现和跨域
现在实际开发中用webapi来实现Restful接口开发很多,我们项目组前一段时间也在用这东西,发现大家用的还是不那么顺畅,所以这里写一个Demo给大家讲解一下,我的出发点不是如何实现,而是为什么? ...
- window.open不被拦截的实现代码
$("#last").click(function(){ var w=window.open(); setTimeout(function(){ w.location=" ...
- 构建配置 Enable multidex
官方文档 配置方法数超过 64K 的应用 随着 Android 平台的持续成长,Android 应用的大小也在增加.当您的应用及其引用的库达到特定大小时,您会遇到构建错误,指明您的应用已达到 Andr ...
- git学习一二三一
svn用的多,但是我是一个geek,git这个美丽的scm,我怎能错过了?于是最近在全方位的窥视它的酮体,把我的一点心得分享给大家把. 先说一说给git的历史, Git是一个开源的分布式版本控制系统, ...
- 转:git设置过滤忽略的文件或文件夹
from: https://www.cnblogs.com/foohack/p/4629255.html git设置过滤忽略的文件或文件夹 我们一般向代码仓库提交项目的时候,一般需要忽略编译生成的 ...
- 如何用Javascript检测到所有的IE版本
如何用Javascript检测到所有的IE版本 function GetIEVersion() { var sAgent = window.navigator.userAgent; var Idx = ...
- Spring中的代理模式
代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式是一种 ...