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

标签 c linux networking posix

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

我知道我可以创建两个套接字。我想知道仅使用 AF_INET6 套接字是否可以做到这一点。

这是操作系统:

> uname -a
> Linux debian 2.6.32-5-amd64 #1 SMP Wed Jan 12 03:40:32 UTC 2011 x86_64 GNU/Linux

最佳答案

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

例如

/* 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;
}

关于c - 有没有办法用单个循环和 IPv6 套接字处理 getaddrinfo() 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5370223/

相关文章:

Linux下使用grep命令

linux - 运行多个 casperjs 实例的推荐环境是什么?

sockets - 我可以使用Winsock发送非IP数据包吗?

linux - IP header 可以在不同机器上有不同的偏移量吗?

python - 带有 asyncio 的 UDP 服务器

c - NCURSES - 垫中的颜色

c# - 将 C DLL 导入 C# 程序的问题

objective-c - 如何在 Objective-C 宏中使用商业标志?

c - 具有 SPI 模式的 Microchip 入门工具包

linux - 使用变量写入文件的特定行号