[Résolu][Socket] connaitre l'IP de connexion

connaitre l'IP de connexion [Résolu][Socket] - C - Programmation

Marsh Posté le 19-03-2010 à 16:26:20    

Bonjour a tous,
je suis en train de faire un serveur ftp mais j'ai un probleme avec le mode "passif".

Code :
  1. void    xbind(int skt, struct sockaddr_in *sin)
  2. {
  3.   int   port;
  4.   port = my_getnbr("8080" );
  5.   sin->sin_addr.s_addr = htonl(INADDR_ANY);
  6.   sin->sin_family = AF_INET;
  7.   sin->sin_port = htons(port);
  8.   if (bind(skt, (struct sockaddr *)sin, sizeof(struct sockaddr )) == -1)
  9.     {
  10.       my_puterror("Bind error!\n" );
  11.       exit(EXIT_FAILURE);
  12.     }
  13. }


Comme vous pouvez le voir, j'écoute toutes les connexion avec "INADDR_ANY", mais je n'arrive pas a savoir sur quelle connexion se connecte mon client (je ne sais pas si je m'exprime assez bien). Y a-t-il une fonction pour connaitre la connexion utilisée par mon client une fois que accept() m'a retourne mon file descriptor?


Message édité par darkiller666 le 01-04-2010 à 23:18:45
Reply

Marsh Posté le 19-03-2010 à 16:26:20   

Reply

Marsh Posté le 19-03-2010 à 21:24:32    

Salut
Je ne suis pas sûr d'avoir compris mais je tente:

Citation :

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
[...]
The argument addr is a pointer to a sockaddr structure.  This structure
is filled in with the address of the peer socket, as known to the  com‐
munications  layer.   The  exact format of the address returned addr is
determined by the  socket’s  address  family  (see  socket(2)  and  the
respective protocol man pages).  The addrlen argument is a value-result
argument: it should initially contain the size of the structure pointed
to  by  addr; on return it will contain the actual length (in bytes) of
the address returned.  When addr is NULL nothing is filled in.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 19-03-2010 à 22:37:57    

Bien essaye ^^ mais c'est pas ca.
accept() remplit bien ma structure avec l'adresse de mon client.
Exemple:
-serveur en écoute sur 127.0.0.1; 192.168.0.1; 10.0.0.6
-client dont l'IP est 10.0.0.9.
Si j'accepte la connexion il va me remplir la structure avec l'IP de mon client donc => 10.0.0.9;
En revanche je veux savoir si il passe par 127.0.0.1, 192.168.0.1 ou  10.0.0.6  dans mon serveur

Reply

Marsh Posté le 20-03-2010 à 12:09:32    

Ok, je n'avais pas compris...
Ce que tu veux savoir c'est l'interface réseau utilisée?
Je ne sais pas si ce code est bon, je ne suis pas expert en réseau mais je suis tombé la dessus:
http://www.developpez.net/forums/d [...] ce-reseau/
En tout cas cela donne au moins une piste.
Avec ça, tu dois pouvoir faire une association socket/interface et donc obtenir ce que tu souhaites.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 20-03-2010 à 20:02:05    

ok merci je test et je te previens

Reply

Marsh Posté le 01-04-2010 à 23:18:11    

darkiller666 a écrit :

ok merci je test et je te previens


Code :
  1. struct hostent *cur_info;
  2.   char  *str;
  3.   je fais mes connexions ...;
  4.   while ((cur_info = gethostent()) != NULL)
  5.     {
  6.       str = inet_ntoa(*(struct in_addr *)cur_info->h_addr_list[0]);
  7.       str = cur_info->h_addr_list[0];
  8.       printf("%s\n",str);
  9.     }


 
gethostent() m'a liste toutes les interfaces presentes et inet_ntoa(...) m'a donne l'IP de l'interface correspondante.
 
D'un cote quand on y pense, gethostent ne fait (que) lire le fichier /etc/hosts, d'ou son nom  :) .
En tout cas merci pour tout.


Message édité par darkiller666 le 01-04-2010 à 23:22:17
Reply

Sujets relatifs:

Leave a Replay

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