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

命令:
adb forward tcp:6100 tcp:7100 
// PC上所有6100端口通信数据将被重定向到手机端7100端口server上
or
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回调函数执行.

[c-sharp] view plain copy print ?
  1. static void listener_event_func(int _fd, unsigned ev, void *_l)  
  2. {  
  3.     alistener *l = _l;  
  4.     asocket *s;  
  5.     if(ev & FDE_READ) {  
  6.         struct sockaddr addr;  
  7.         socklen_t alen;  
  8.         int fd;  
  9.         alen = sizeof(addr);  
  10.         fd = adb_socket_accept(_fd, &addr, &alen); // 首先接受该连接   
  11.         if(fd < 0) return;  
  12.         gliethttp_server = create_local_socket(fd); // 为我们的小应用程序建立维护对象gliethttp_server   
  13.         if(gliethttp_server) {  
  14.             gliethttp_server->transport = l->transport;  
  15.             connect_to_remote(gliethttp_server, l->connect_to); // 发送"tcp:7100"到手机端,手机端将建立一个与7100端口server链接的gliethttp_client,作为   
  16.                                                  // 与HOST这里建立的gliethttp_server对象进行数据传输的手机端程序[luther.gliethttp]   
  17.                                                  // 如果成功连接之后,手机端adbd将返回"OKAY",进而gliethttp_server和gliethttp_client将绑定在一起   
  18.                                                  // gliethttp_server发送的数据将通过HOST的daemon直接传递给gliethttp_client   
  19.                                                  // gliethttp_client数据将通过手机的adbd直接发送给HOST的gliethttp_server,然后传递给我们的小程序B[lutehr.gliethttp]   
  20.             return;  
  21.         }  
  22.         adb_close(fd);  
  23.     }  
  24. }  
  25. void connect_to_remote(asocket *s, const char *destination)  
  26. {  
  27.     D("Connect_to_remote call /n");  
  28.     apacket *p = get_apacket();  
  29.     int len = strlen(destination) + 1;  
  30.     if(len > (MAX_PAYLOAD-1)) {  
  31.         fatal("destination oversized");  
  32.     }  
  33.     D("LS(%d): connect('%s')/n", s->id, destination);  
  34.     p->msg.command = A_OPEN; // 打开手机端"tcp:7100"端口   
  35.     p->msg.arg0 = s->id;  
  36.     p->msg.data_length = len;  
  37.     strcpy((char*) p->data, destination);   
  38.     send_packet(p, s->transport);  
  39. }  
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].

 

Note:

回想以前同事的工作,看来Android端实现的是USB-NET。

你可能感兴趣的:(server,socket,tcp,unix,Stream,手机)