Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1731 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°408334
peak
Posté le 26-05-2003 à 18:42:29  profilanswer
 

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??

mood
Publicité
Posté le 26-05-2003 à 18:42:29  profilanswer
 

n°408364
peak
Posté le 26-05-2003 à 19:49:54  profilanswer
 

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  :??:

n°408873
peak
Posté le 27-05-2003 à 10:13:50  profilanswer
 

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?

n°408880
LetoII
Le dormeur doit se réveiller
Posté le 27-05-2003 à 10:16:59  profilanswer
 

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
n°408903
VisualC++
J'va y penser ...
Posté le 27-05-2003 à 10:26:59  profilanswer
 

gethostbyaddr ou du genre de memoire

n°408929
polo021
Posté le 27-05-2003 à 10:49:48  profilanswer
 

gethostbyname plutot

n°408940
LetoII
Le dormeur doit se réveiller
Posté le 27-05-2003 à 10:58:00  profilanswer
 

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
n°409057
xWillow
Posté le 27-05-2003 à 12:26:28  profilanswer
 

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

n°409698
peak
Posté le 27-05-2003 à 19:38:13  profilanswer
 

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 :)....
 

n°410292
xWillow
Posté le 28-05-2003 à 13:04:55  profilanswer
 

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

mood
Publicité
Posté le 28-05-2003 à 13:04:55  profilanswer
 

n°438949
peak
Posté le 25-06-2003 à 13:51:14  profilanswer
 

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:  
 
 
 
 
 
 

n°439095
Konar
Posté le 25-06-2003 à 15:05:59  profilanswer
 

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
n°440469
peak
Posté le 26-06-2003 à 16:11:31  profilanswer
 

: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?)

n°440548
Konar
Posté le 26-06-2003 à 17:09:24  profilanswer
 

Peak a écrit :


(la fonction OutputDebugString vient de kelle lib?)


 
windows.h

n°440661
peak
Posté le 26-06-2003 à 18:22:13  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[ASP] Obtenir la config (hard/soft) à traver d'un INTRANETgenerer une chaine de caractere a partir d'un compteur [i]
[RESOLU] [ACCESS] Créer des réferences simplifié a partir d'une tableModification a partir d'une liste...
Comment recreer un projet Borland/Delphi a partir de .pas et .dfmLancer une commande à partir dans ordinateur distant ?
Ouvrir une boite de dialogue à partir d'un menu dynamique (API)modifier un enregistrement a partir d'une requete
[php] Obtenir le contenu d'une ligne précise d'un fichier[SGBD]Créer un graph des clés étrangères à partir d'une base existante
Plus de sujets relatifs à : obtenir une ip 'classic' à partir de accept !?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR