obtenir une ip 'classic' à partir de accept !?

obtenir une ip 'classic' à partir de accept !? - C++ - Programmation

Marsh Posté le 26-05-2003 à 18:42:29    

Hey,  
J'ai un tit prob,
j'utilise la fonction systeme accept pour etablir une connection par socket stream entre un client et un serveur.
Je voudrait connaitre l'ip du client :
int  accept(int sock, struct sockaddr *adresse, socklent_t *longueur);
je m'attendai à ce qu'elle soit dans 'adress->sa_data' mais apparement j'ai mal compris cette partie du man :

Citation :

L'argument  adresse est un paramètre résultat qui est renseigné avec l'adresse de  l'entité  se  connectant,  telle qu'elle  est  connue  par  la couche de communication.  Le format exact du paramètre adresse est fonction du  domaine dans  lequel  la  communication  s'établit. Le paramètre resultat longueur  est  renseigné  avec  la  longueur  (en octets)  de  l'adresse  retournée.  Ce paramètre doit initialement contenir la longueur du paramètre adresse.


 
Donc, comment avoir cette adress ip à partir de 'adress' si cela est possible??

Reply

Marsh Posté le 26-05-2003 à 18:42:29   

Reply

Marsh Posté le 26-05-2003 à 19:49:54    

Je pensai que "intet_ntoa" serai peut etre la solution à mon prob mais il reçoit en param une struct in_addr or moi j'ai une sockaddr  :??:

Reply

Marsh Posté le 27-05-2003 à 10:13:50    

bon je suis pas très claire... :sweat:  
un ptit exemple ne fera pas de mal.
 

Code :
  1. int ListeningPort(int SocketID, , struct sockaddr *padress)
  2. {
  3. int S;
  4. int alen;
  5. fprintf(stderr, "Listening port \n" );
  6. alen = sizeof(struct sockaddr);
  7. if ((S=accept(SocketID, padress ,&alen)) <0)
  8. {
  9.  return erreur_fatale("accept failed\n" );
  10. }
  11. //comment afficher l'ip du client dans un format du style xxx.xxx.xxx.xxx  
  12. return S;
  13. }


 
je pensai fair psad->sa_data mais apparement c'est pas trop ça?

Reply

Marsh Posté le 27-05-2003 à 10:16:59    

Me semble qu'il y a une fonction qui fait la trduction sock_adr -> chaîne et inverssement, mais je me souvient plus de son nom sur le coup, je vais y réfléchir un peu :D


---------------
Le Tyran
Reply

Marsh Posté le 27-05-2003 à 10:26:59    

gethostbyaddr ou du genre de memoire

Reply

Marsh Posté le 27-05-2003 à 10:49:48    

gethostbyname plutot

Reply

Marsh Posté le 27-05-2003 à 10:58:00    

Peak a écrit :

bon je suis pas très claire... :sweat:  
un ptit exemple ne fera pas de mal.
 

Code :
  1. int ListeningPort(int SocketID, , struct sockaddr *padress)
  2. {
  3. int S;
  4. int alen;
  5. fprintf(stderr, "Listening port \n" );
  6. alen = sizeof(struct sockaddr);
  7. if ((S=accept(SocketID, padress ,&alen)) <0)
  8. {
  9.  return erreur_fatale("accept failed\n" );
  10. }
  11. //comment afficher l'ip du client dans un format du style xxx.xxx.xxx.xxx  
  12. return S;
  13. }


 
je pensai fair psad->sa_data mais apparement c'est pas trop ça?


 
A t a fonction tu lui passerai pas par hazard une sockaddr_in castée en sockaddr? Par ce que si c le cas tu doit pouvoir chopper la in_addr dedans.


---------------
Le Tyran
Reply

Marsh Posté le 27-05-2003 à 12:26:28    

struct sockaddr *paddress; ( y a deux d a address :) )
 
inet_ntoa(paddress->sin_addr);

Reply

Marsh Posté le 27-05-2003 à 19:38:13    

xWillow a écrit :

struct sockaddr *paddress; ( y a deux d a address :) )
 
inet_ntoa(paddress->sin_addr);


sin_addr fait pas parti de sockaddr y'a juste sa_data et sa_family
 
en effet gethostbyaddr() à l'air nikel :)....
 

Reply

Marsh Posté le 28-05-2003 à 13:04:55    

oui tu as raison,
tu peux aussi avoir
 
struct sockaddr_in *paddress;
 
accept( Sock, (struct sockaddr *)paddress, &alen );
et la tu pourra faire comme j'ai dit

Reply

Marsh Posté le 28-05-2003 à 13:04:55   

Reply

Marsh Posté le 25-06-2003 à 13:51:14    

Je ressort un vieux topique...mais j'étai en blocus et ai plus pu me permettre de passer du temps sur mes codes!
J'en reviens donc au prob que je me pausai y'a un mois.
 
En fait un petit mot d'explication sur les cast serai pas de refus :
Kand je fait  
 
struct sockaddr_in *paddress;
accept( Sock, (struct sockaddr *)paddress, &alen );  
 
on est bien d'accord ke la structure bit à bit de padress est exactement la même ke si je faisait :
 
struct sockaddr *paddress;
accept( Sock, paddress, &alen );  
 
Ils auront juste un traitement différent dû à leur type et au routines de traitement ki y sont associé!?
 
Si je n'ai pas encore fait de faute je vois pas comment un simple cast pourrai arranger mon prob a moins d'une relation direct entre sockaddr et sockaddr_in.
 
A la limite si vous me donniez un exemple ki marche je pourrai faire des hypothèses, mais aucunes des technique ne me semble convaincante du moins aucun ne ma donné le résultat voulu !!!!  
 
p.e:

Code :
  1. int S;
  2. struct sockaddr_in *sad;
  3. int alen;
  4. struct hostent *ptrh;
  5. char *s_adrs;
  6. fprintf(stderr, "Listening port \n" );
  7. alen = sizeof(struct sockaddr);
  8. if ((S=accept(SocketID, (struct sockaddr *) sad ,&alen)) <0)
  9. {
  10.  return erreur_fatale("accept failed\n" );
  11. }
  12. //s_adrs=inet_ntoa(sad->sin_addr);  //ceci ne compile même pas!
  13. printf("ADRS  :   %s\n", sad->sin_addr);//ceci ne sera jamais afficher et le prog sera ejecté!!


 :??:  :??:  
:bounce:  
 
 
 
 
 
 

Reply

Marsh Posté le 25-06-2003 à 15:05:59    

tu rates : ton parametre 'sad' n'est pas alloué.
 
une solution :
 

Code :
  1. struct sockaddr_in clnt_addr;
  2. int Client_Length = sizeof (struct sockaddr_in);
  3. SOCKET client = accept(s, (struct sockaddr*)&clnt_addr, &Client_Length);
  4. OutputDebugString(inet_ntoa(clnt_addr.sin_addr));


Message édité par Konar le 25-06-2003 à 15:06:48
Reply

Marsh Posté le 26-06-2003 à 16:11:31    

:jap:  
merci, ça marche
en fait le prob est dans  
 
s_adrs=inet_ntoa(sad->sin_addr);
 
c'est marrant par ec que d'après le man la fonction revoit un char* et lorsque je fait cette assignation gcc m'affiche : "affectation transforme un pointeur en entier sans transtypage"  
 
je voit pas trop où est l'entier mais bon du moment ke ça marche  :D    
 
(la fonction OutputDebugString vient de kelle lib?)

Reply

Marsh Posté le 26-06-2003 à 17:09:24    

Peak a écrit :


(la fonction OutputDebugString vient de kelle lib?)


 
windows.h

Reply

Marsh Posté le 26-06-2003 à 18:22:13    

ok, mais je suis sous linux....
merci quand même ;)

Reply

Sujets relatifs:

Leave a Replay

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