J'ai ouvert un serveur de socket TCP (j'ai omis quelques éléments, il est extrait de ici est-il possible d'obtenir l'adresse IP du serveur de SOCKFD? Si non, dois-je regarder? P> Edit: Je veux connaître l'adresse du serveur (ceci est avant que tout client se connecte). p> p>
4 Réponses :
Si vous voulez savoir qui est à l'autre extrémité de votre prise, vous pouvez utiliser GetPeername a > à 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. P>
L'adresse du serveur est à vous de vous. P>
dépend de quels paramètres sont transmis à la fonction Vous pouvez spécifier un Regardez le Page Man P> Bind () code>. p>
unique IP code> ou lier votre prise à chaque adresse de votre hôte. P>
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. P>
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. Donc, la prise d'écoute n'a aucune information sur la propriété intellectuelle.
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 code>. P>
Vous devrez trouver quelles interfaces ont une interface de la machine et de ce qui est leur IPS. P>
Ceci n'est que partiellement, à savoir dans le cas particulier où Bind () code> a été appelé à l'aide de
inaddr_any code>. Voir la bonne réponse donnée par Davide Berra i>.
@alk, je suppose que s'il appelait bind () code> avec une adresse spécifique, il n'aurait pas demandé quelle adresse elle était adressée.
L'adresse du serveur est celle qui a été transmise à l'appel réussi à Bind () code> (comme indiqué dans la source que vous avez liée). P>
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 code>,
getockname code> aidera.
Accepter () Code> elle-même (optioally) renvoie l'adresse de l'homologue connecté (voir
homme accepter code>).
La valeur renvoyée par un appel réussi à
socket () code> 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 code> immédiatement après le
pour () code> boucle, si
p code> n'est pas
null code>. Ceci est simplement parce que c'est ce que le code
lier code> s la prise à.