You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过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端口转发+客户端发送即可实现命令交互,步骤如下:

  1. 建立ADB端口转发:在笔记本电脑上执行命令,将设备上TCP服务器监听的端口(对应代码中port_变量,假设为8080)转发到本地端口:
    adb forward tcp:8080 tcp:8080
    
  2. 发送命令到应用:在笔记本电脑上用nc、telnet或自定义客户端连接本地转发端口,直接发送JSON字符串或文件内容。例如用nc发送JSON命令:
    echo '{"command": "execute_task"}' | nc localhost 8080
    
  3. 完善应用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"}
    EOF
    
    应用中需添加stdin读取逻辑,比如用getline循环读取输入并处理。
  • Unix域套接字通信:在应用中创建Unix域套接字服务器,通过ADB执行socat命令连接套接字发送数据:
    adb shell socat - UNIX-CONNECT:/tmp/your_app_socket
    
    这种方式比TCP更轻量,适合设备本地进程间通信。
  • ADB Intent广播(仅Android设备):如果你的Linux设备是Android,可在应用中注册广播接收器,通过adb shell am broadcast发送携带命令的Intent,应用接收后解析执行。纯Linux设备不适用。

三、补充说明

  • 发送文件时,可先通过adb push将文件传到设备临时目录,再通过TCP命令告知应用文件路径,让应用自行读取;也可直接通过TCP套接字发送文件内容。
  • 确保设备防火墙允许目标TCP端口通信,ADB转发通常可绕过常规端口限制。

内容的提问来源于stack exchange,提问作者bourne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:45:04