国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網(wǎng)站 > WEB開發(fā) > 正文

Android “adb forward”端口映射

2024-04-27 13:53:43
字體:
供稿:網(wǎng)友

簡析adb的端口映射功能,將PC端的某端口數(shù)據(jù)重定向到手機端的一個端口

================================================

曾經(jīng)以為adb forward是個好東東,因為通過這個映射之后,在PC和設(shè)備之間就可以直接socket通信了。可現(xiàn)在終于發(fā)現(xiàn),世界不是完美的。

Android Debug Bridge設(shè)計的目的,一是用來管理所有連接的設(shè)備;二是提供各種服務(wù),供PC端有效的控制設(shè)備。主要包括三個部分:

1) ADB-server

運行在PC端,是一個始終在后臺運行的進程,作為與手機端交互的唯一接口。ADB-server處理ADB-client的請求,一部分請求無須與 設(shè)備交互,直接在PC本地完成;剩下的請求需要與設(shè)備端的adbd交互,ADB-server起到了一個switcher的作用。

2) ADB-client

運行在PC端,可以同時存在多個。每個ADB-client由用戶啟動,完成多種功能。其作用是與ADB-server交互,實現(xiàn)用戶請求的功能。

3) adbd

運行在設(shè)備端的常駐進程,同時只存在一個。作用是接收PC端的ADB-server發(fā)來的請求,并作出對應(yīng)操作。

這三個可執(zhí)行程序都是同一套代碼編譯出來的,位于<Android Source Dir>/system/core/adb/

ADB-client和ADB-server對應(yīng)同一個可執(zhí)行文件“adb(.exe)”,編譯時有-DADB_HOST=1宏。而adbd對應(yīng)目 標設(shè)備上的可執(zhí)行文件"adbd",編譯時的參數(shù)是-DADB_HOST=0。

.              P  C                                                                                    Device
--------------------------------------                                        -------------------------------------
[ADB-client]<----->[Port A:]                                         [:Port A']<------>[Program A]
[ADB-client]<----->[Port B:]ADB-server<----->adbd[:Port B']<------>[Program B]
[ADB-client]<----->[Port C:]                                         [:Port C']---------(empty)
.                               |<--------Android Debug Bridge---------->|

(這個圖實在是調(diào)不好了,不管了)

ADB提供了PC與設(shè)備交互的橋梁,結(jié)構(gòu)上清晰明了。其中adb forward功能提供了端口映射,希望給用戶提供透明的socket通信。但可惜,這與真實的網(wǎng)絡(luò)socket有點區(qū)別。

在TCP網(wǎng)絡(luò)編程中,Client的Socket(C)如果調(diào)用Connect()成功,就說明已經(jīng)和Server端的Socket(S)連接上, 可以通訊了。但是如果使用adb forward做端口映射,就不一樣了。端口映射的實質(zhì)是,讓ADB-server作為一個switcher轉(zhuǎn)發(fā)ADB-client的數(shù)據(jù)包,送給 adbd,adbd再發(fā)給設(shè)備端的對應(yīng)端口。因此一旦建立了映射,就相當于ADB-server開始監(jiān)聽這個目標端口。而此時如果有C去嘗試 Connect這個端口,是一定會成功的,因為與C連接的是ADB-server,而非真正的設(shè)備上的目標程序。這就出現(xiàn)了,即使Connect()成 功,卻完全無法知道究竟是否成功連接到S。

因此,判斷真正連接成功的方法,只有輪詢收發(fā)握手數(shù)據(jù)包。程序中約定好事先做個交互:C發(fā)送一個數(shù)據(jù)包,等待S回復;C如果收到了S的回復包,說明 連通;如果接收超時,則認為沒有連通。在沒有連通的情況下,需要重新建立Socket,并Connect(),然后再嘗試握手。

 
原文地址:http://mandapeng.vip.zhourenjian.com/?p=7
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 汝州市| 铁岭市| 葫芦岛市| 凌源市| 阜康市| 天长市| 桐乡市| 元阳县| 饶河县| 乡城县| 嘉峪关市| 曲水县| 西城区| 农安县| 曲周县| 汝南县| 大港区| 英超| 安化县| 筠连县| 永川市| 犍为县| 文山县| 临夏市| 株洲市| 嘉善县| 肇庆市| 同江市| 胶州市| 中江县| 女性| 曲沃县| 普定县| 深圳市| 正镶白旗| 高州市| 永城市| 通许县| 靖江市| 花莲县| 水城县|