client - serveur --> bouh un serveur avec @ 0.0.0.0

client - serveur --> bouh un serveur avec @ 0.0.0.0 - C - Programmation

Marsh Posté le 27-10-2003 à 17:32:16    

bon voila le but est de programmer un client-serveur.
pour l'instant j'en suis au serveur et j'ai deux problèmes.
mais d'abord exposons l'horreur...
 

Code :
  1. /* -------- */
  2. /* -RESEAU- */
  3. /* -------- */
  4. /* ------------------- */
  5. /* -Fichier a inclure- */
  6. /* ------------------- */
  7. #include <stdio.h> /* pour la gestion I/O */
  8. #include <strings.h> /* pour bzero */
  9. #include <sys/types.h>
  10. #include <sys/socket.h> /* pour la creation du socket */
  11. #include <netinet/in.h>
  12. #include <netdb.h>
  13. #include <unistd.h> /* pour la fonction close */
  14. #include <arpa/inet.h>  /* pour la fonctioon inet_ntoa */
  15. /* ------------------------------- */
  16. /* -Corps du programme principale- */
  17. /* ------------------------------- */
  18. int main(int argc, char * argv[])
  19. {
  20. /* ---------- */
  21. /* -variable- */
  22. /* ---------- */
  23.   char *nom_serveur_a = "iparla" ; /* nom du serveur d'authentification */
  24.   char *nom_serveur_c = "kartxila" ; /* nom du serveur de calcul */
  25.   int port_a = 64101 ; /* port du serveur authentification */
  26.   int port_c = 64102 ; /* port du serveur de calcul */
  27.   int descripteur_a; /* descripteur du socket de connexion avec iparla */
  28.   struct sockaddr_in serveur_a;
  29.   struct hostent *adresse_a;
  30. /* -------------------initialisation---------------------------- */
  31. /* initialisation : on initialise la variable d'adresse d'iparla */
  32.   bzero(&serveur_a, sizeof(serveur_a)); /* remise a zero de la variable serveur_a */
  33.   adresse_a = gethostbyname(nom_serveur_a); /* on recupere l'adresse internet d'iparla */
  34.   /* test si la fonction a trouver une adresser correspondant au serveur */
  35.   if (adresse_a==NULL)
  36.     {
  37.       printf("Nom du serveur incorrect\n" );
  38.       return -1;
  39.     }
  40.   serveur_a.sin_family = AF_INET;
  41.   serveur_a.sin_port = htons(port_a);
  42.   serveur_a.sin_addr.s_addr=((struct in_addr *)(adresse_a -> h_addr))->s_addr;
  43. /* -------------------creation_socket -------------------- */
  44. /* creation_socket : on va creer le terminal de connexion */
  45.   if ((descripteur_a = socket(AF_INET,SOCK_STREAM,0)) < 0)
  46.     {
  47.       printf("Erreur lors de la creation du socket\n" );
  48.       return descripteur_a;
  49.     }
  50.  
  51. /* -----------------bind_socket------------------- */
  52. /* bind_socket : on va attacher le socket a iparla*/
  53.   if ( bind(descripteur_a, &serveur_a, sizeof(struct sockaddr_in))< 0)
  54.     {
  55.       printf("impossible de lier la socket au serveur\n" );
  56.       return -1;
  57.     }
  58.   printf("Connexion Etablie avec %s\n",  (inet_ntoa(serveur_a.sin_addr)));
  59. /* --------------------Fermer_socket------------------------------ */
  60. /* fermer_socket : on va fermer le socket relier au serveur iparla */
  61.   close(descripteur_a);
  62. return 1;
  63. }


 
je sais que c loin d'être bien programmé mais on verra ça plus tard...
 
alors le premier prb vient au niveau du bind.
si je mes &serveur_a il va dans le if, mais si je mes INADDR_ANY ça me l'indique pas (et se connecte donc soit disant bien). pk ? ça veut dire que l'adresse que je récupère plus haut n'est pas valide ? (pourtant je fais un test pour savoir si le nom existe).
 
Deuxième prb : printf("Connexion Etablie avec %s\n",  (inet_ntoa(serveur_a.sin_addr)));
 
dans les deux cas précédents, il me retourne comme adresse 0.0.0.0
En plus le inet_ntoa est censé prendre serveur_a.sin_addr.s_addr mais quand je mes il m'envoie : "incompatible type for argument 1 of 'inet_ntoa' ".
 
c pas logique il devrait plutot m'indiquer le contraire non ?

Reply

Marsh Posté le 27-10-2003 à 17:32:16   

Reply

Marsh Posté le 27-10-2003 à 17:49:06    

tu devrais utiliser tcpdump pour débugger ce genre de programme à mon avis


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 27-10-2003 à 17:56:28    

bon j'ai regardé un peu le fichier
/etc/hosts
et à ma grande surprise y'a pas iparla mais juste kartxila et localhost (---> commment fait t'il alors pour me trouver une adresse à Iparle ???).
 
Ensuite j'ai vraiment bcp de mal à comprendre la ligne suivante (commentaire du prof : il est intéressant de prendre le tps de comprendre ce que signifie l'affectation ci dessus...) :
 
serveur_a.sin_addr.s_addr=((struct in_addr *)(adresse_a -> h_addr))->s_addr;  
 
je comprends qu'on récupérer une adresse contenu dans adresse_a et qu'on l'a met dans serveur_a.sin_addr.s_addr mais je le fonctionnement ensuite c compliqué.
 

Reply

Marsh Posté le 27-10-2003 à 17:59:20    

N.B : je ne peux pas utiliser tcpdump car à l'iut au niveau de l'install on a aucun droit...

Reply

Marsh Posté le 28-10-2003 à 17:14:26    

un petit up pleaseeeee

Reply

Marsh Posté le 28-10-2003 à 21:53:42    

je voudrais juste un petit up sur cette partie :
 
Deuxième prb : printf("Connexion Etablie avec %s\n",  (inet_ntoa(serveur_a.sin_addr)));  
 
dans les deux cas précédents, il me retourne comme adresse 0.0.0.0  
En plus le inet_ntoa est censé prendre serveur_a.sin_addr.s_addr mais quand je mes il m'envoie : "incompatible type for argument 1 of 'inet_ntoa' ".  
 
c pas logique il devrait plutot m'indiquer le contraire non ?
 
ET
 
Ensuite j'ai vraiment bcp de mal à comprendre la ligne suivante (commentaire du prof : il est intéressant de prendre le tps de comprendre ce que signifie l'affectation ci dessus...) :  
 
serveur_a.sin_addr.s_addr=((struct in_addr *)(adresse_a -> h_addr))->s_addr;    
 
je comprends qu'on récupérer une adresse contenu dans adresse_a et qu'on l'a met dans serveur_a.sin_addr.s_addr mais je le fonctionnement ensuite c compliqué.  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed