通过本地 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;
}
您无法在您正在使用的 TCP 套接字上进行
recv()
操作。您需要首先 listen()
一个客户端,然后在 accept()
返回的套接字上 recv()
。