C socket obtenir l'adresse IP à partir de filedescriptor retourné à partir de l'accepter
Je sais que cette question semble typique et plusieurs fois répondu, mais je pense que si vous lisez les détails, il n'est pas si courant (je n'ai pas trouver).
Le point est que je suis en train d'élaborer un service unix en c qui ouvre un socket et attend les connexions, quand j'ai une connexion que je de créer un nouveau processus pour traiter, de sorte qu'il peut être de multiples connexions ouvertes en même temps.
int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, (socklen_t*)&clientaddr_size);
Plus tard (après et à l'intérieur de certaines autres méthodes et code) le processus de l'enfant enregistrer les informations de connexion à la BBDD et j'ai besoin aussi, en ce moment précis,, à obtenir l'adresse IP que ouvert que la connexion à traiter.
Comme il peut y avoir de plusieurs connexions en même temps et la variable struct sockaddr_in clientaddr
que je passe à l'accepter méthode est partagé par tous les processus je ne suis pas sûr que, plus tard, est une bonne idée d'obtenir l'adresse IP de l'information de cette façon parce qu'alors j'ai pu obtenir l'adresse IP à partir d'une autre connexion ouverte.
Je voudrais être en mesure de accéder à l'adresse IP à partir du descripteur de fichier int newfd
que je reçois de l'accepter méthode (le retour de l'entier). Est-il possible? Ou j'ai mal compris le descripteur de fichier de la fonction?
Merci @alk je vois, c'est de manière similaire, bien que (pour sûr, parce que de mon anglais), je n'ai pas besoin de le lier l'adresse, j'ai besoin de l'adresse du client. Maintenant, j'ai vu la façon dont est similaire, mais avec le getpeername() méthode 🙂
Ahok, je vois. Donc, que vous aimeriez ajouter une réponse à votre propre question, et même de l'accepter.
double possible de Obtenir une adresse distante/IP - C les Sockets Berkeley
Ok. Celui-ci oui @JosephQuinsey, de l'égalité et de et plus simple.. Désolé je n'ai pas trouvé avant...
OriginalL'auteur Aleix | 2013-12-09
Vous devez vous connecter pour publier un commentaire.
Ok. Grâce à @alk et @rileyberton j'ai trouvé la bonne méthode à utiliser, le getpeername:
Donc maintenant dans un processus différent, je peux obtenir l'adresse IP (dans la "chaîne"
clientip
) du client d'origine de la connexion uniquement le descripteur de fichiernewfd
obtenus avec l'accepter méthode.addr_size
commeint
, mais commesocklen_t
. Le Casting duint*
àsocklen_t*
dans l'appel àgetpeername()
masque les problèmes possibles en cassocklen_t
serait de taille différente alorsint
. De même pour l'appel àaccept()
.Fait! et aussi je l'ai changé à l'appel à la méthode accept (). Merci beaucoup pour la suggestion:)
Ce n'est pas le code en C, C++.
OriginalL'auteur Aleix
Vous utilisez
getsockname()
(http://linux.die.net/man/2/getsockname) obtenir l'adresse IP de la borne de la prise.Également répondu avant, ici: C - IP Publique depuis le descripteur de fichier
OriginalL'auteur rileyberton