7
votes

Obtenez l'adresse IP du descripteur de socket?

J'ai ouvert un serveur de socket TCP (j'ai omis quelques éléments, il est extrait de ici xxx

est-il possible d'obtenir l'adresse IP du serveur de SOCKFD? Si non, dois-je regarder?

Edit: Je veux connaître l'adresse du serveur (ceci est avant que tout client se connecte).


5 commentaires

I.P. adresse de quelle fin? Vous-même ou l'endroit que vous avez connecté? Ou les deux?!


Ce socket n'est pas connecté, il n'y a donc aucune adresse à obtenir. Après accepter , getockname aidera.


Accepter () elle-même (optioally) renvoie l'adresse de l'homologue connecté (voir homme accepter ).


La valeur renvoyée par un appel réussi à socket () n'est connecté à aucun client ni lié à aucune interface, il n'y a donc pas d'adresse IP côté client ni d'une adresse IP côté serveur qui pourrait être déterminée partout.


L'adresse IP est p-> ai_addr, p-> aiaddrlen immédiatement après le pour () boucle, si p n'est pas null . Ceci est simplement parce que c'est ce que le code lier s la prise à.


4 Réponses :


12
votes

Si vous voulez savoir qui est à l'autre extrémité de votre prise, vous pouvez utiliser GetPeername à Linux. getockname vous dira qui vous êtes. Vous décidez de l'adresse que vous souhaitez que votre serveur s'asseoir au départ, à Bind TIME. < / p>

Vous pouvez également trouver cela afin de la question utile: Socket Bind to Network Interface < / p>

et le livre "Programmation réseau Unix, Vol 1", par W. Richard Stevens.


0 commentaires

1
votes

L'adresse du serveur est à vous de vous.

dépend de quels paramètres sont transmis à la fonction Bind () .

Vous pouvez spécifier un unique IP ou lier votre prise à chaque adresse de votre hôte.

Regardez le Page Man


0 commentaires

3
votes

Vous ne pouvez pas utiliser la prise pour obtenir l'adresse du serveur avant que le client se connecte, car il n'est pas connu.

En principe, un hôte peut avoir plusieurs IPS. L'IP utilisée pour une connexion à un serveur est celle appartenant à l'interface, à travers laquelle la connexion est arrivée. Jusqu'à ce qu'une connexion arrive, il n'est pas connu.
Même si vous n'avez qu'une seule adresse IP, les connexions peuvent arriver de l'intérieur de la machine, auquel cas l'adresse serait 127.0.0.1 .

Donc, la prise d'écoute n'a aucune information sur la propriété intellectuelle.
Vous devrez trouver quelles interfaces ont une interface de la machine et de ce qui est leur IPS.


2 commentaires

Ceci n'est que partiellement, à savoir dans le cas particulier où Bind () a été appelé à l'aide de inaddr_any . Voir la bonne réponse donnée par Davide Berra .


@alk, je suppose que s'il appelait bind () avec une adresse spécifique, il n'aurait pas demandé quelle adresse elle était adressée.



0
votes

L'adresse du serveur est celle qui a été transmise à l'appel réussi à Bind () (comme indiqué dans la source que vous avez liée).


0 commentaires