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é.
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éeOriginalL'auteur SpartanProgrammer | 2011-02-07
Vous devez vous connecter pour publier un commentaire.
C'est un très réponse tardive, mais il peut toujours être utile...
J'ai modifié cette ligne:
:
et qui a fait le tour pour moi.
OriginalL'auteur GSL