Android NDK socket connect () retourne 0 quand il devrait échouer en 3g

J’ai écrit un socket dans le NDK android et un serveur dans c. Il est capable de se connecter au serveur très bien. Toutefois, si le serveur est en panne ou si je tente de le connecter à une adresse IP aléatoire différente, l’appel à la connexion renvoie toujours 0 lorsqu’il doit renvoyer -1.

Voici le code pour le client:

#include  #include  #include  #include  #include  #include  #include  #include  #define APPNAME "MyApp" #define logcat(...) __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, __VA_ARGS__) int createSocket() { int sockFD; if ((sockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0) { logcat("Unable to create socket"); return -1; } logcat("Socket created: %i", sockFD); return sockFD; } JNIEXPORT jint JNICALL Java_myapp_client( JNIEnv* env, jobject thiz ) { struct sockaddr_in server; int sockFD, new_socket; char * message; if ((sockFD = createSocket()) < 0) { return -1; } server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(server ip); server.sin_port = htons(8888); new_socket = connect(sockFD, (struct sockaddr *)&server, sizeof(server)); logcat("Connect return value: %i", new_socket); int rtn = recv(sockFD, message, sizeof(char), 0); logcat("Message: %i", rtn); close(sockFD); return 1; } 

Un descripteur valide est créé pour le socket, les valeurs de retour pour connect et recv sont nulles lorsque je lance ceci sans que mon serveur ne soit en cours d’exécution. Il convient de noter que l’appareil Android est connecté à Internet via Internet mobile.

J’ai enlevé des pièces spécifiques Android

 #include  #include  #include  #include  #include  #include  int createSocket() { int sockFD; if ((sockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("Unable to create socket"); return -1; } printf("Socket created: %i", sockFD); return sockFD; } int main() { struct sockaddr_in server; int sockFD, new_socket; char * message; if ((sockFD = createSocket()) < 0) { return -1; } server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_port = htons(8888); new_socket = connect(sockFD, (struct sockaddr *)&server, sizeof(server)); printf("Connect return value: %i", new_socket); int rtn = recv(sockFD, message, sizeof(char), 0); printf("Message: %i", rtn); close(sockFD); return 1; } 

Cela fonctionne comme prévu. Essayez vous-même en vous connectant à 127.0.0.1 . S'il n'y a pas de serveur en cours d'exécution sur votre ordinateur hôte, la connexion échouera (la connexion retournera -1 et errno sera réglé correctement).

Assurez-vous que l'adresse IP que vous utilisez pour la connexion pointe vraiment vers votre serveur.

Aussi, il y a un problème dans recv:

 int rtn = recv(sockFD, message, sizeof(char), 0); 

Un message variable est un pointeur qui n'a été affecté à aucune mémoire (il contient des valeurs de stack de mémoire) et que vous écrasez-le. Voir le manuel pour recv (2) .

Pour résoudre ce problème, vous devez soit affecter votre pointeur à une mémoire allouée:

 message = malloc(1); //char is always a single byte 

ou utilisez stack au lieu de tas pour stocker l'octet du message:

 char message; ... int rtn = recv(sockFD, &message, sizeof(char), 0); 

J'ai supposé que votre message est toujours un seul octet.

Gardez à l'esprit que ici:

 printf("Message: %i", rtn); 

vous imprimez le code de retour et non le message réel.