簡體   English   中英

Android NDK網絡問題:TCP連接失敗

[英]Android NDK Networking problems: TCP Connection fails

我在使用Android NDK時遇到了一些麻煩。

我的項目需要用C編寫的軟件組件,它們可以通過TCP接收數據,以便在Android OS上執行。

為此,我使用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編譯的所有內容之前。

--edit - 我還應該提一下,我已經能夠通過這個應用程序在Java上通過套接字發送數據。 只是C插座真的搞砸了。 即使是通過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);

這對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM