15

在代码中:

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

在 4.5.x gcc 上交叉编译(通用臂架构)时我收到警告:

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

获取名称信息是:

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;

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

4

2 回答 2

15

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

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

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

较新的函数可以做更多的事情:它们处理 IPv6并且可以将诸如“http”之类的字符串转换为 80(端口)。将来,他们还可以确定是否应将 TCP 用于所讨论的服务或 SCTP。界面准备就绪。

于 2013-05-19T05:55:50.963 回答
11

Beej's解释得很好。gethostbyname()不适用于 IPV6,因此您应该getnameinfo()改用。您所要做的就是填写所需的信息,即

getnameinfo(
    &sa,             // Pointer to your struct sockaddr
    sizeof sa,       // Size of this struct
    host,            // Pointer to hostname string
    sizeof host,     // Hostname string buffer length
    service,         // Pointer to service name string
    sizeof service,  // Service name string buffer length
    0                // No flags given
);

编辑:经过一番研究,我发现

getnameinfo(&sa, sizeof(sa), hostname, size_hostname, NULL, 0, 0);

应该足够了。

编辑#2我注意到您正在尝试使用getnameinfo作为主机名的返回值。但这是不正确的,主机名保存在提供的host指针中。返回值指示操作是否足够。另请查看手册页

于 2012-04-27T07:27:26.580 回答