Comment puis-je trouver la machine actuelle du nom d'hôte complet en C (nom d'hôte et de domaine de l'information)?
Dans un projet C (POSIX), comment puis-je obtenir le nom complet pour le système actuel?
Par exemple, je peux mettre juste le nom de ma machine en faisant
gethostname()
de unistd.h. Cela pourrait me donner machine3
en retour, mais je suis à la recherche de machine3.somedomain.com
par exemple.
Comment puis-je obtenir cette information? Je ne veux pas utiliser un appel à system() pour ce faire, si possible.
Vous devez vous connecter pour publier un commentaire.
Pour obtenir le nom complet d'une machine, nous devons d'abord obtenir le nom d'hôte local, puis recherche le nom canonique.
La meilleure façon de le faire est de commencer par obtenir le nom d'hôte local à l'aide de
uname()
ougethostname()
et puis en effectuant une recherche avecgethostbyname()
et en regardant lah_name
membre de la structure qu'il renvoie. Si vous utilisez le c ANSI, vous doit utilisationuname()
au lieu degethostname()
.Exemple:
Malheureusement,
gethostbyname()
est obsolète dans le courant de spécification POSIX, comme il ne joue pas bien avec l'IPv6. Une version plus moderne de ce code serait d'utilisergetaddrinfo()
.Exemple:
Bien sûr, cela ne fonctionnera que si la machine dispose d'un nom de domaine complet de donner - si non, le résultat de la
getaddrinfo()
finit par être le même que le nom d'hôte non qualifié.Host names are limited to 255 bytes.
. Vous utilisez 1024.hostname
pourrait revenirbox1
où comme l'ip attribuée àeth0
permettrait de résoudre à retournerbox2.test2.net
et de laeth1
permettrait de résoudre à retournerbox3.test3.net
.Ma solution:
gethostname()
est POSIX façon à obtenir nom d'hôte local. Découvrezman
.BSD fonction
getdomainname()
peut vous donner de nom de domaine de sorte que vous pouvez construire nom d'hôte qualifié complet. Il n'est pas POSIX façon à obtenir un domaine, j'ai peur.Je crois que vous êtes à la recherche pour:
gethostbyaddress
Qu'à faire passer l'IP localhost.
Il y a aussi une fonction gethostbyname, qui est également utile.
Le moyen le plus facile, essayez la commande uname()
Si cela ne fonctionne pas, utilisez gethostname() puis gethostbyname() et, enfin, gethostbyaddr()
La h_name de hostent{} doit être votre nom de domaine complet