gpt4 book ai didi

Android NDK 网络问题 : TCP Connection fails

转载 作者:可可西里 更新时间:2023-11-01 02:31:34 54 4
gpt4 key购买 nike

我在使用 Android NDK 时遇到了一些问题。

我的项目需要用 C 语言编写的软件组件,这些组件可以通过 TCP 接收数据以在 Android 操作系统上执行。

为此,我使用 BSD 套接字用 C 语言制作了一个简单的服务器和客户端,并且可以通过 PC 上的连接成功地来回发送消息。现在我已经将客户端代码移动到 NDK 中,并且无法从模拟器或实际的 android 设备连接到我的服务器。 NDK 编译时没有警告或错误,模拟器/手机在 wifi 上并且在 list 中启用了互联网权限。是什么赋予了?

它所做的只是创建一个套接字,填写主机/端口信息并尝试连接:如果确实连接,则发送消息,否则返回错误。 Android 始终为连接返回负值


此客户端代码在 Mac/Windows/Linux 上编译/执行,有效:

PC客户端代码:

int tcp_socket = socket(AF_INET, SOCK_STREAM,0); 
if(tcp_socket< 0 ) {
cerr << "Failed to create TCP socket." << endl;
return 2;
}

sockaddr_in server_tcp_add;
server_tcp_add.sin_family = AF_INET;
server_tcp_add.sin_port = htons(tcp_port); //set via command line: Yes, they are the same for the android
hostent *hostp = gethostbyname(server_host);
memcpy(&server_tcp_add.sin_addr, hostp->h_addr, hostp->h_length);
socklen_t slen = sizeof(server_tcp_add);

if(connect(tcp_socket,(sockaddr*)&server_tcp_add, slen) <0 ){
cerr<< "Failed to connect to server with TCP. " << endl;
close(tcp_socket);
return 3;
}

char* myString = "This is my message";
send(tcp_socket, myString, strlen(myString), 0);

close(tcp_socket);

此代码在 Android NDK 上执行,不

代码:NDK客户端

jstring Java_networking_client_activate_initiateTcpConnection(JNIEnv* env, jobject javaThis){
int tcp_socket = socket(AF_INET, SOCK_STREAM,0);
if(tcp_socket < 0){
return (*env)->NewStringUTF(env, "ERROR CREATING SOCKET");
}
const char* server_host = "some.numbers.that.work"; //It's a valid IP I don't feel like sharing
unsigned short server_port = 43000;

struct sockaddr_in server_tcp_addr;
server_tcp_addr.sin_family = AF_INET;
server_tcp_addr.sin_port = htons(server_port);
struct hostent *hostp = gethostbyname(server_host);
memcpy(&server_tcp_addr, hostp->h_addr, hostp->h_length);
socklen_t slen = sizeof(server_tcp_addr);
if(connect(tcp_socket,(struct sockaddr*)&server_tcp_addr, slen) < 0){ //fails here
close(tcp_socket);
return (*env)->NewStringUTF(env, "ERROR CONNECTING TO SERVER");
}

char* message = "hello from android!";
send(tcp_socket, &message, sizeof(message),0);

return (*env)->NewStringUTF(env, "TCP message sent!");
}

基本相同;需要将结构放在所有内容的前面以便 NDK 进行编译。

--edit--我还应该提到,我已经能够使用这个应用程序通过 Java 中的套接字发送数据。只是 C socket 真的搞砸了。即使是拥有通过 NDK 工作的 C 套接字的其他人的示例,我们也会非常感激。

最佳答案

这是一个很晚的答案,但它可能仍然有用......

我改变了这一行:

memcpy(&server_tcp_addr, hostp->h_addr, hostp->h_length);

为此:

memcpy(&server_tcp_addr.sin_addr.s_addr, hostp->h_addr, hostp->h_length);

这对我有用。

关于Android NDK 网络问题 : TCP Connection fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4927356/

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