gpt4 book ai didi

c++ - 如何使用 getnameinfo 而不是 gethostbyname?

转载 作者:IT老高 更新时间:2023-10-28 22:26:13 31 4
gpt4 key购买 nike

在代码中:

if ((host = (struct hostent*) gethostbyname(address) ) == 0) // address is a string

在 4.5.x gcc 上进行交叉编译(通用 arm 架构)时出现警告:

(.text+0x1558): warning: gethostbyname is obsolescent, use getnameinfo() instead.

getnameinfo是:

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
);

它有更多的参数......我对此感到困惑,我只需要它像 gethostbyname 一样工作。要传递什么参数来让它像 gethostbyname 一样简单愚蠢?

最后是我的尝试:

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;

它编译良好,启动时没有段错误,但我无法连接我的服务器:(

最佳答案

gethostbyname() 进行名称→IP 查找。它应该被替换为 getaddrinfo(),它可以做同样的事情。

这意味着警告是完全错误的。 getnameinfo() 是 gethostbyaddr() 的替换,用于 IP→名称查找。反过来。

名称→IP:gethostbyname()getaddrinfo()
IP→名称:gethostbyaddr(), getnameinfo()

较新的函数可以做更多:它们处理 IPv6 并且可以将像“http”这样的字符串转换为 80(端口)。将来,他们还可以确定是否例如TCP 应该用于有问题的服务或 SCTP。界面已准备就绪。

关于c++ - 如何使用 getnameinfo 而不是 gethostbyname?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10346194/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com