Comment utiliser getnameinfo au lieu de gethostbyname?
dans le code :
if ((host = (struct hostent*) gethostbyname(address) ) == 0) //address is a string
J'ai avertissement lors de la compilation croisée (générique d'architecture arm) sur 4.5.x gcc :
(.text+0x1558): warning: gethostbyname is obsolescent, use getnameinfo() instead.
getnameinfo est:
int WSAAPI getnameinfo(
__in const struct sockaddr FAR *sa,
__in socklen_t salen,
__out char FAR *host,
__in DWORD hostlen,
__out char FAR *serv,
__in DWORD servlen,
__in int flags
);
Et il a obtenu plus de paramètres... Et je suis confondue avec elle, j'ai juste besoin de fonctionner comme gethostbyname. Qu'est-ce paramètre à passer à keep it simple stupid, comme c'était avec gethostbyname?
Enfin, voici mon essai:
struct sockaddr_in servAddr;
struct hostent *host; /* Structure containing host information */
/* open socket */
if ((handle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
return LILI_ERROR;
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(address.ptr());
servAddr.sin_port = htons(port);
char servInfo[NI_MAXSERV];
if ( ( host = (hostent*) getnameinfo(
(struct sockaddr *) &servAddr
,sizeof (struct sockaddr)
,address.ptr(), address.size()
,servInfo, NI_MAXSERV
,NI_NUMERICHOST | NI_NUMERICSERV ) ) == 0)
return LILI_ERROR;
if (::connect(handle, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
return LILI_ERROR;
Il compile bien et pas d'erreur de segmentation sur démarrer, mais je ne peux pas me connecter à mon serveur 🙁
Que vous avez marqué à la question de la c++, je vous suggère d'utiliser boost.asio.
Je vous remercie. mais pourtant, je ne veux pas toucher boost. Mais je pense qu'il n'y a aucune raison de ne pas utiliser boost, donc je pense que je vais prendre un coup d'oeil.
google.com/... Numéro 3.
Vous êtes à l'aide de la valeur de retour, en supposant qu'il est titulaire du nom de domaine, mais ce n'est pas correct. J'ai fait un edit de mon répondre à cette question.
Je vous remercie. mais pourtant, je ne veux pas toucher boost. Mais je pense qu'il n'y a aucune raison de ne pas utiliser boost, donc je pense que je vais prendre un coup d'oeil.
google.com/... Numéro 3.
Vous êtes à l'aide de la valeur de retour, en supposant qu'il est titulaire du nom de domaine, mais ce n'est pas correct. J'ai fait un edit de mon répondre à cette question.
OriginalL'auteur Cynede | 2012-04-27
Vous devez vous connecter pour publier un commentaire.
gethostbyname()
fait un nom→recherche de l'IP. Il devrait être remplacé pargetaddrinfo()
, ce qui peut faire la même chose.Cela signifie que l'alarme est complètement faux. getnameinfo() est le remplacement de gethostbyaddr(), à la fois pour IP→les recherches de noms. L'inverse.
nom→IP:
gethostbyname()
,getaddrinfo()
IP→nom:
gethostbyaddr()
,getnameinfo()
Les nouvelles fonctions peuvent plus: ils gèrent IPv6 et peut traduire des chaînes de caractères comme 'http' 80 (port). Dans l'avenir, ils peuvent également déterminer si, par exemple, TCP doit être utilisée pour le service en question ou SCTP. L'interface est prête.
OriginalL'auteur Robert Siemer
Beej s explique assez bien.
gethostbyname()
ne fonctionne pas bien avec l'IPV6 et donc vous devez utilisergetnameinfo()
à la place. Tout ce que vous avez à faire est de remplir les informations demandées, à savoirModifier: Après quelques recherches, j'ai trouvé que
devrait être suffisant.
Edit #2 j'ai remarqué que vous essayez d'utiliser la valeur de retour de
getnameinfo
comme nom d'hôte. Mais ce n'est pas correct, le nom d'hôte est enregistré dans leshost
pointeur. La valeur de retour indique si l'opération a été suffisante. Aussi jeter un oeil à la page de man.*host
et de*service
, êtes-vous d'obtenir le bon contenu dans les cordes?c'étaient fonctionne très bien avec gethostbyname, et pourtant je ne peux pas attraper le bug ici.
mais c'est getaddrinfo exemple, et je suis en train d'utiliser getnameinfo.
Droit, mais comme mentionné sur le site, vous pouvez aussi effectuer le nom d'hôte recherches avec
getaddrinfo
.OriginalL'auteur Sebastian Dressler