能否通过ADB向带TCP服务的Linux端C++应用发送自定义命令?
问题描述
我有一个运行在支持ADB的Linux设备上的C++应用,该设备已连接至我的笔记本电脑,且应用内置了TCP服务器(代码如下)。请问是否可通过ADB直接向该应用发送自定义命令(如合法JSON字符串或文件),使应用执行对应操作?若此方案不可行,还有哪些基于ADB的通信机制可用?我可为该应用新增功能,另外我已考虑过推送JSON文件至设备并在启动时读取,但因需发送多条独立命令,无法批量处理,故该方案不适用。
void TCPServer::start() { try { server_socket_ = socket(AF_INET, SOCK_STREAM, 0); if (server_socket_ < 0) { LOG("Failed to create socket"); return; } int opt = 1; if (setsockopt(server_socket_, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { close(server_socket_); return; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(port_); if (bind(server_socket_, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { LOG("Failed to bind server socket"); close(server_socket_); return; } if (listen(server_socket_, 1) < 0) { LOG("Failed to listen on server socket"); close(server_socket_); return; } struct pollfd fds[1]; fds[0].fd = server_socket_; fds[0].events = POLLIN; static const int READY_TIMEOUT = 3000; while (!isStopRequested()) { int ready = poll(fds, 1, READY_TIMEOUT); if (ready < 0) { LOG("polling error"); break; } else if (ready == 0) { LOG("timed out"); break; } if (fds[0].revents & POLLIN) { // New connection int client_socket = accept(server_socket_, NULL, NULL); if (client_socket < 0) { LOG("Failed to accept connection"); close(server_socket_); return; } // perform some operation } } } catch (std::exception excep) { LOG("exception", excep.what()); } }
解决方案
一、利用现有TCP服务器通过ADB通信(完全可行)
你的应用已经内置TCP服务器,只需通过ADB端口转发+客户端发送即可实现命令交互,步骤如下:
- 建立ADB端口转发:在笔记本电脑上执行命令,将设备上TCP服务器监听的端口(对应代码中
port_变量,假设为8080)转发到本地端口:adb forward tcp:8080 tcp:8080 - 发送命令到应用:在笔记本电脑上用
nc、telnet或自定义客户端连接本地转发端口,直接发送JSON字符串或文件内容。例如用nc发送JSON命令:echo '{"command": "execute_task"}' | nc localhost 8080 - 完善应用TCP处理逻辑:现有代码仅处理了连接建立,需在
// perform some operation处添加数据读取与命令执行逻辑,示例:
另外注意:现有代码中char buffer[1024]; ssize_t bytes_read = read(client_socket, buffer, sizeof(buffer)-1); if (bytes_read > 0) { buffer[bytes_read] = '\0'; // 解析buffer中的JSON内容,执行对应操作 LOG("Received command: %s", buffer); } close(client_socket); // 处理完成后关闭客户端连接poll超时后会退出循环,建议移除超时退出逻辑,让服务器持续监听,或调整超时后重新进入循环。
二、其他基于ADB的通信机制
如果不想依赖TCP,还可选择以下方案:
- ADB Shell标准IO交互:修改应用支持从标准输入读取命令,向标准输出返回结果。通过
adb shell直接传递命令:
应用中需添加adb shell "./path/to/your/app" << EOF {"command": "cmd1"} {"command": "cmd2"} EOFstdin读取逻辑,比如用getline循环读取输入并处理。 - Unix域套接字通信:在应用中创建Unix域套接字服务器,通过ADB执行
socat命令连接套接字发送数据:
这种方式比TCP更轻量,适合设备本地进程间通信。adb shell socat - UNIX-CONNECT:/tmp/your_app_socket - ADB Intent广播(仅Android设备):如果你的Linux设备是Android,可在应用中注册广播接收器,通过
adb shell am broadcast发送携带命令的Intent,应用接收后解析执行。纯Linux设备不适用。
三、补充说明
- 发送文件时,可先通过
adb push将文件传到设备临时目录,再通过TCP命令告知应用文件路径,让应用自行读取;也可直接通过TCP套接字发送文件内容。 - 确保设备防火墙允许目标TCP端口通信,ADB转发通常可绕过常规端口限制。
内容的提问来源于stack exchange,提问作者bourne
相关产品推荐
相关产品推荐

