Android NDK problèmes de mise en Réseau: TCP Connexion échoue

Je vais avoir quelques problèmes avec l'Android NDK.

Mon projet nécessite des composants logiciels écrits en C qui peut recevoir des données via le protocole TCP pour être exécuté sur le système d'exploitation Android.

À cette fin, j'ai fait un simple client et serveur en C à l'aide de sockets BSD, et peut envoyer des messages d'avant en arrière avec succès à travers la connexion sur Pc. Maintenant, j'ai déménagé le code côté client dans le NDK, et ne peut pas se connecter à mon serveur à partir de l'émulateur ou à un appareil android. NDK compile sans erreurs ou avertissements, l'émulateur de téléphone sont sur le wifi et l'internet des autorisations de permis dans le manifeste. Ce qui donne?

Tout ce qu'il fait, c'est de faire une prise, remplissez hôte/port d'infos et de tentative de connexion: Si elle ne se connecter, envoyer un message, sinon renvoie une erreur. Android retourne toujours une valeur négative pour connecter


Ce client code, compilation/exécution sur Mac/Windows/Linux, fonctionne:

PC code Client:

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);

Ce code, exécuté sur l'Android NDK, ne pas

Code: NDK Client

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!");
}

En grande partie identiques; nécessaires pour les mettre struct en face de tout pour NDK pour compiler.

--edit--je devrais également mentionner, j'ai été capable d'envoyer des données sur les sockets en Java avec cette application. Juste le C les sockets c'est vraiment le vissage des trucs. Encore un exemple de quelqu'un d'autre qui a C les sockets de travail via NDK serait extrêmement apprécié.

Deux idées: d'Abord voir si vous pouvez utiliser quelque chose d'autre, comme le navigateur web ou netcat (nc) de la bad, de la ligne de commande ou même de ping pour vérifier que vous pouvez atteindre l'hôte. Ensuite, vérifiez que vous utilisez la bonne longueur de la valeur pour toutes les structures, il y a un (ne me souviens plus qui) que les gens souvent se tromper avec le résultat que cela peut fonctionner sur certaines implémentations et pas sur d'autres.
Pouvez-vous vérifier errno lors de la connexion() échoue?
De gauche à elle seule le problème pour quelques jours, et revint. Pour répondre à vos commentaires: je peux utiliser le navigateur du téléphone Droid je suis en train de tester sur. Je suis aussi assez sûr que ces sont le droit len les fonctions à utiliser. Depuis, j'ai consulté errno de la NDK comme __android_log_write(ANDROID_LOG_ERROR,"socket errno", strerror(errno)); et l'erreur qui est imprimé est "l'Adresse de la Famille non pris en charge par le protocole". Été googler autour de vous pour les réponses, pense qu'il pourrait avoir à faire avec ipv6/4 problèmes ou le fichier hosts sur le téléphone. Toute aide est grandement appréciée

OriginalL'auteur SpartanProgrammer | 2011-02-07