Android NDK网络问题:TCP连接失败

时间:2011-02-07 22:23:50

标签: android sockets networking tcp android-ndk

我在使用Android NDK时遇到了一些麻烦。

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

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

它所做的只是制作套接字,填写主机/端口信息并尝试连接:如果它确实连接,则发送消息,否则返回错误。 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!");
}

大致相同;需要将struct放在NDK编译的所有内容之前。

- 编辑 - 我还应该提一下,我已经能够通过这个应用程序在Java上通过套接字发送数据。只是C插座真的搞砸了。即使是通过NDK工作的C套接字的其他人的样本也会非常感激。

1 个答案:

答案 0 :(得分:11)

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

我更改了这一行:

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

到此:

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

这对我有用。