Linux系统调用:getaddrinfo返回-2

时间:2010-12-09 07:33:06

标签: c linux system-calls

我正在使用系统调用getaddrinfo并返回-2。我试着知道这个错误是什么,并得到那个“名称或服务未知”。 这个名字 - 这是我的主人名,我相信它是众所周知的。但该服务是一个从运行更改为运行的数字。我怎么知道我带的是正确的参数?

我的代码:

int GetSockPeerIPs(int sock, AddressList &addresses, int &error,
                  int family, bool zeroport)
{
    struct sockaddr_storage ss;
    socklen_t salen = sizeof(ss);
    struct sockaddr *sa;
    struct addrinfo hints, *paddr, *paddrp;

    sa = (struct sockaddr *)&ss;

    if (getpeername(sock, sa, &salen) != 0) {
        error = errno;
        return -1;
    }

    char hbuf[NI_MAXHOST];
    char pbuf[NI_MAXSERV];
    if (0 != (error = getnameinfo(sa, salen,
                      hbuf, sizeof(hbuf),
                      pbuf, sizeof(pbuf),
                      0))) {
        return -1;
    }

    memset(&hints, 0, sizeof(hints));
    if (ATNetworkTool::AF_XINETX == family) {
        hints.ai_family = PF_UNSPEC;
    } else {
        hints.ai_family = family;
    }
    hints.ai_socktype = SOCK_STREAM;
    if (0 != (error = getaddrinfo(hbuf, pbuf, &hints, &paddrp))) {
        return -1;
    }
    addresses.clear();
    for (paddr = paddrp; paddr; paddr = paddr->ai_next) {
        if (ATNetworkTool::AF_XINETX == family) {
            if (!ATAddress::saIsInet(paddr->ai_addr)) {
                continue;
            }
        }
        if (zeroport) {
            addresses.insert(ATAddress(paddr->ai_addr, 0));
        } else {
            addresses.insert(paddr->ai_addr);
        }
    }
    freeaddrinfo(paddrp);
    return 0;
}

谢谢! GLN

2 个答案:

答案 0 :(得分:2)

您有错误代码。你有没有想过找出它的含义?在这个场合,我已经为你做了。但这就是我所做的,所以下次你可以自己查找。

查看getaddrinfo()的手册页,我发现它可以返回许多错误代码,例如EAI_AGAIN。数值将在某个头文件中定义,所以我做了

cd /usr/include
find . -name "*.h" -exec grep -l EAI_AGAIN {} \;

这标识了netdb.h。所以我在vi中打开了它,这就是它所说的:

# define EAI_BADFLAGS     -1    /* Invalid value for `ai_flags' field.  */
# define EAI_NONAME       -2    /* NAME or SERVICE is unknown.  */
# define EAI_AGAIN        -3    /* Temporary failure in name resolution.  */
# define EAI_FAIL         -4    /* Non-recoverable failure in name res.  */
# define EAI_FAMILY       -6    /* `ai_family' not supported.  */
# define EAI_SOCKTYPE     -7    /* `ai_socktype' not supported.  */
# define EAI_SERVICE      -8    /* SERVICE not supported for `ai_socktype'.  */
# define EAI_MEMORY       -10   /* Memory allocation failure.  */
# define EAI_SYSTEM       -11   /* System error returned in `errno'.  */
# define EAI_OVERFLOW     -12   /* Argument buffer overflow.  */

所以基本上,你传入的名称或服务对于getaddrinfo是未知的。如果我是你的话,我会检查前两个参数是否合理。

答案 1 :(得分:0)

getaddrinfo对数据的格式很挑剔,在解析配置文件时确保没有多余的空格通常在主机名参数中尾随空格,否则你会收到此错误,在这种情况下错误是正确的,但不是很有用。