gpt4 book ai didi

Android NDK 套接字 connect() 在 3g 上失败时返回 0

转载 作者:行者123 更新时间:2023-11-30 16:30:26 34 4
gpt4 key购买 nike

我在android NDK中编写了一个套接字,并在c中编写了一个服务器。它能够很好地连接到服务器。但是,如果服务器关闭或者我尝试让它连接到不同的随机 IP,则连接调用在应该返回 -1 时仍然返回 0。

这是客户端的代码:

#include <stdio.h>
#include <jni.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <android/log.h>
#include <unistd.h>

#define APPNAME "MyApp"
#define logcat(...) __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, __VA_ARGS__)


int createSocket() {
int sockFD;
if ((sockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
logcat("Unable to create socket");
return -1;
}

logcat("Socket created: %i", sockFD);
return sockFD;


}
JNIEXPORT jint JNICALL
Java_myapp_client( JNIEnv* env,
jobject thiz ) {
struct sockaddr_in server;
int sockFD, new_socket;
char * message;
if ((sockFD = createSocket()) < 0) {
return -1;
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(server ip);
server.sin_port = htons(8888);
new_socket = connect(sockFD, (struct sockaddr *)&server, sizeof(server));
logcat("Connect return value: %i", new_socket);

int rtn = recv(sockFD, message, sizeof(char), 0);
logcat("Message: %i", rtn);

close(sockFD);

return 1;
}

为套接字创建了有效的描述符,当我在服务器未运行的情况下运行此命令时,连接和接收的返回值为零。可能值得注意的是,Android 设备通过移动互联网连接到互联网。

最佳答案

我删除了 Android 特定部分

#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>


int createSocket() {
int sockFD;
if ((sockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Unable to create socket");
return -1;
}

printf("Socket created: %i", sockFD);
return sockFD;


}
int main() {
struct sockaddr_in server;
int sockFD, new_socket;
char * message;
if ((sockFD = createSocket()) < 0) {
return -1;
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(8888);
new_socket = connect(sockFD, (struct sockaddr *)&server, sizeof(server));
printf("Connect return value: %i", new_socket);

int rtn = recv(sockFD, message, sizeof(char), 0);
printf("Message: %i", rtn);

close(sockFD);

return 1;
}

这按预期工作。连接到 127.0.0.1 亲自尝试一下。如果您的主机上没有运行服务器,那么它将无法连接(连接将返回 -1 并且 errno 将被适当设置)。

确保您用于连接的 IP 地址确实指向您的服务器。

recv也有问题:

int rtn = recv(sockFD, message, sizeof(char), 0);

变量message是一个尚未分配给任何内存的指针(它包含一些堆栈垃圾值),并且您正在覆盖它。请参阅manual for recv (2) .

要解决此问题,您应该将指针分配给某些已分配的内存:

message = malloc(1); //char is always a single byte

或者使用堆栈而不是堆来存储消息字节:

char message;
...
int rtn = recv(sockFD, &message, sizeof(char), 0);

我假设您的消息始终是单个字节。

请记住这里:

printf("Message: %i", rtn);

您正在打印返回代码而不是实际消息。

关于Android NDK 套接字 connect() 在 3g 上失败时返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51150532/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com