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