Bonsoir,
Quelques remarques dans l'ordre dans lequel je lis tes fichiers :
connexion.c
1 2 3 4 5 6
| 7: if(sock == SOCKET_INVALIDE)
8: {
9: printf("Socket invalide pour socket()\n");
10: close(sock);
11: exit(1);
12: } |
- Refermer un socket qui n'existe pas n'a pas de sens (et peut provoquer un plantage);
- Il te manque #include <stdlib.h> si tu veux utiliser exit().
25: erreur = connect(sock, (SOCKADDR *) &sin, sizeof(SOCKADDR));
C'est sizeof(SOCKADDR_IN), qu'il faut passer. C'est précisément parce que tu es obligé de transtyper toutes les structures dérivées vers SOCKADDR que la fonction te demande de passer leur taille : elle ne peut pas la déduire elle-même. Si tu mets celle de SOCKADDR, il n'y aucune raison pour qu'elle soit capable de lire correctement un SOCKADDR_IN.
D'une manière générale, si tu passes la taille du membre transmis plutôt que du type en général, sizeof(sin), tu es sûr de ne jamais te tromper, même si tu changes de type ;
36:void reception (SOCKET sock);
Ce prototype de fonction n'a aucune utilité à cet endroit. Typiquement, il devrait se trouver dans un *.h. Ensuite, ton fichier n'y fait pas appel. Enfin, déclarer cette fonction en fin de fichier n'a aucun intérêt ;
connexion.h
36:void reception (SOCKET sock);
(C'est un hasard que cela tomnbe à la même ligne). C'est déjà mieux, mais cela n'a toujours aucun intérêt. « reception() » est une fonction du serveur. Elle est donc complètement invisible au client.
mainconnexion.c
10 client = connexion(client,adress_ip);
Tu écrases ton socket avec la valeur de retour de ta fonction ! Bon, en l'occurrence, ça ne change rien puisque connexion() renvoie « sock » tel que reçu, mais cela reste une erreur de conception.
1 2 3 4 5 6
| 12: if(client == ERREUR_SOCKET || client == SOCKET_INVALIDE)
13: {
14: printf("Connexion impossible\n");
15: }else{
16: printf("Connexion réussie\n");
17: } |
Ta fonction connexion() renvoie le socket sans le modifier, ou bien tue le programme. Ce bloc de code ne sera donc jamais exécuté.
ServeurConnexion.c
8: sin.sin_addr.s_addr = htonl(INADDR_ANY);
Si je ne me trompe pas, les macros style INADDR_ANY sont faites pour remplir directement les champs de la structure. Il ne faut donc pas les convertir au préalable comme tu le fait, au risque de modifier leur valeur (bon. ici, INADDR_ANY correspond à 0.0.0.0, donc ça devrait fonctionner quand même).
1 2 3 4 5 6 7 8 9 10 11
| 12: if(erreur == ERREUR_SOCKET)
13: {
14: printf("Socket invalide pour bind()\n");
15: close(sock);
16: }
17: erreur = listen (sock, 1);
18: if(erreur == ERREUR_SOCKET)
19: {
20: printf("Socket invalide pour listen()\n");
21: close(sock);
22: } |
En cas d'erreur, tu écris un message d'erreur et tu refermes ton socket mais tu n'interromps pas ton programme (ni avec return, ni avec exit()). Il n'y a donc aucun raison pour qu'il s'arrête seul. Il va donc passer à la suite et comme ton socket est toujours invalide, chaque étape va déclencher son propre message d'erreur. Voila pourquoi tu les obtiens tous.
Partager