首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法用单循环和IPv6套接字处理getaddrinfo()输出?

有没有办法用单循环和IPv6套接字处理getaddrinfo()输出?
EN

Stack Overflow用户
提问于 2011-03-21 01:38:24
回答 1查看 1.1K关注 0票数 1

我希望能够遍历getaddrinfo()函数的结果列表,并使用该列表中的每个元素调用connect(),直到connect()成功为止。不幸的是,即使我指定了AI_ALL | AI_V4MAPPED标志和一个AF_INET6系列,结果也是好坏参半。列表的第一部分包含sockaddr_in6结构,第二部分包含sockaddr_in结构,因此我不能将它们与AF_INET6套接字一起使用。

我知道我可以创建两个套接字。我想知道是否可以只使用AF_INET6套接字。

下面是操作系统:

代码语言:javascript
复制
> uname -a
> Linux debian 2.6.32-5-amd64 #1 SMP Wed Jan 12 03:40:32 UTC 2011 x86_64 GNU/Linux
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-21 03:44:09

您不必担心您正在创建的是AF_INET还是AF_INET6套接字。只需将getaddrinfo()调用的数据传递给socket()调用即可。

例如:

代码语言:javascript
复制
/* returns -1 on error, or a connected socket descriptor*/
int opensock(const char *hostname, const char *service)
{
    struct addrinfo hint, *host, *res = NULL;
    int tcp_sd = -1, error;

    memset(&hint, '\0', sizeof(hint));
    hint.ai_socktype = SOCK_STREAM;
    hint.ai_family = PF_UNSPEC;
    error = getaddrinfo(hostname, service, &hint, &res);
    if(error){
        syslog(LOG_DEBUG,"getaddrinfo failed. Cant find host %s: %m",hostname);
        return tcp_sd;
    }
    for (host = res; host; host = host->ai_next) {
        tcp_sd = socket(host->ai_family, host->ai_socktype, host->ai_protocol);
        if (tcp_sd < 0) {
            continue;
        }

        if (connect(tcp_sd, host->ai_addr, host->ai_addrlen) < 0) {
            close(tcp_sd);
            tcp_sd = -1;
            continue;
        }

        break;      /* okay we got one */
    }

    freeaddrinfo(res);

    return tcp_sd;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5370223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档