无法通过本地 TCP 连接接收文本

问题描述 投票:0回答:1

通过本地 TCP 连接发送文本成功! 通过本地 IP 地址从 Ubuntu 向 AOSP 发送文本。由于某种原因,它可以使用第三方 apk 应用程序接受文本。但它不适用于服务内的C++环境。 我尝试过代码的不同变体。我无法接受这个文字。错误:“连接被拒绝”或“接收失败:传输端点未连接”。

该服务已成功允许使用互联网。检查过。

static const String16 sAccessWifiStatePermission("android.permission.ACCESS_WIFI_STATE");
static const String16 sInternetPermission("android.permission.INTERNET");
static const String16 sAccessNetworkStatePermission("android.permission.ACCESS_NETWORK_STATE");
...
bool checksAccessNetworkStatePermission = permissionChecker.checkPermissionForPreflight(
            sAccessNetworkStatePermission, attributionSource, String16(), AppOpsManager::OP_NONE)!= permission::PermissionChecker::PERMISSION_HARD_DENIED;
...

我使用不同的端口,例如5030..5033。并使用智能手机的本地IP地址:192.168.2.110。我在 AOSP 中的 C++ 代码中指定此地址或使用 INADDR_ANY。 为什么我无法接受短信?

无法接受文本的代码变体之一:

std::string receiveTextTcp(int port) {

    struct sockaddr_in serv_addr;
    int fd = socket(AF_INET, SOCK_STREAM, 0);
  if (fd < 0) {
     ALOGI("Failed socket: %s", strerror(errno));
    return "";
  }
ALOGI("fd : %d, port:%d", fd, port);
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(port);
    int reuse_flag = 1;

int result = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse_flag, sizeof(reuse_flag));
if (result < 0) {
    ALOGI("Failed setsockopt: %s, port:%d", strerror(errno), port);
}

int bind_result = bind(fd, reinterpret_cast<sockaddr*>(&serv_addr), sizeof(serv_addr));

if (bind_result < 0) {
    ALOGI("Failed bind: %s, port:%d", strerror(errno), port);
}

result = listen(fd, 1);
if (result < 0) {
    ALOGI("Failed listen: %s, port:%d", strerror(errno), port);
}

  char buffer[1024];
  int bytes_received = recv(fd, buffer, sizeof(buffer), 0);
  if (bytes_received < 0) {
    ALOGI("Failed recv: %s, port:%d", strerror(errno), port);
    
  }

  ALOGI("Failed buffer: %s, port:%d", buffer, port);


  close(fd);


   return "";
}

成功将文本发送到 PC 的成功代码变体:

bool SendData(const std::string& ip, int port, const std::string& text) {

  int sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if (sockfd < 0) {
    ALOGI("Failed to create socket: %s, sockfd:%d", strerror(errno), sockfd);
    return false;
  }

  struct sockaddr_in servaddr;
  memset(&servaddr, 0, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(port);

  // Use inet_pton instead of inet_addr
  if (inet_pton(AF_INET, ip.c_str(), &servaddr.sin_addr) <= 0) {
     ALOGI("Invalid IP address: %s", ip.c_str() );
    close(sockfd);
    return false;
  }

  if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
     ALOGI("Failed to connect to server: %s", strerror(errno) );
    close(sockfd);
    return false;
  }


const char* message = text.c_str();
size_t message_len = strlen(message);

if (send(sockfd, message, message_len, 0) < 0) {
     ALOGI("Failed send, err: %s . message:%s", strerror(errno), message );
    close(sockfd);
    return false;
  } else{
    ALOGI("send ok. message:%s", message );
  } 

  close(sockfd);

  return true;
}
android c++ tcp android-source
1个回答
0
投票

您无法在您正在使用的 TCP 套接字上进行

recv()
操作。您需要首先
listen()
一个客户端,然后在
accept()
返回的套接字上
recv()
    

© www.soinside.com 2019 - 2024. All rights reserved.