Android NDK Сетевые проблемы: сбой TCP-соединения

У меня проблемы с Android NDK.

Мой проект требует программных компонентов, написанных на C, которые могут получать данные по TCP для выполнения на Android OS.

С этой целью я создал простой сервер и клиент на языке C, использующий сокеты BSD, и может успешно отправлять сообщения туда и обратно через соединение на ПК. Сейчас я' я переместил клиентский код в NDK и не может подключиться к моему серверу из эмулятора или с реального устройства Android. NDK компилируется без предупреждений или ошибок, эмулятор / телефон подключены к Wi-Fi и в манифесте включены разрешения для Интернета. Что дает?

Все, что он делает, это создает сокет, заполняет информацию о хосте / порте и пытается подключиться: если он подключается, отправляет сообщение, иначе возвращает ошибку. Android всегда возвращает отрицательное значение для соединения


. Этот клиентский код, скомпилированный / выполненный в Mac / Windows / Linux, работает:

Клиентский код ПК:

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.

- изменить - я также должен упомянуть, что с помощью этого приложения я смог отправлять данные через сокеты на Java. Только розетки C, которые ' действительно облажался. Был бы чрезвычайно признателен даже образец кого-то еще, у кого есть сокеты C, работающие через NDK.

6
задан ROMANIA_engineer 13 January 2018 в 08:57
поделиться