c++ - ptr->ai_family 与 AF_INET 相比有何作用

c++ - What does ptr->ai_family do vs AF_INET

我正在浏览 msdn 的“Getting Started With Winsock”,他们打开一个带有参数

的套接字
struct addrinfo *result = NULL,
                *ptr    = NULL,
                hints;

iResult = getaddrinfo(
        argv[1], 
        DEFAULT_PORT, 
        &hints, 
        &result
);

ptr=result;

ConnectSocket = socket(
        ptr->ai_family,                 // Address Family (address families like ipv6 ipv4)
        ptr->ai_socktype,               // Type (Like tcp, udp ect)
        ptr->ai_protocol                // Protocol to use (0 = service provider chooses)
    );

但是 binarytides“Winsock tutorial”是这样做的(他们使用的是 C,但我看到有人用 C++ 这样做)

s = socket(
    AF_INET , 
    SOCK_STREAM , 
    0 
)

ptr-> 是做什么的? 以及为什么要使用它而不是像 AF_INET 这样的设置?

此外,如果您有空闲时间并且熟悉套接字,我将不胜感激。

socket(ptr->ai_family,ptr->ai_socktype, ptr->ai_protocol);

传入变量来创建套接字,而不是对值进行硬编码。您获得的优势是该代码适用于 IPv4 和 IPv6。

ptr->ai_family 只是一个整数,是 struct addrinfo. (And if you are wondering about the particular syntax of ptr->, you can go through this question 的一个成员),它将具有 AF_INETAF_INET6 的值(或者理论上任何其他支持的协议)

getaddrinfo() 的调用将查找主机名,并将其解析为 IPv4 或 IPv6,然后将结果传递给 socket() 以创建正确类型的套接字。如果主机名解析为 IPv4 主机,则创建一个可以处理 IPv4 的套接字,如果它解析为 IPv6,则创建一个 IPv6 套接字。

如果您改为对值进行硬编码,例如作为 AF_INET,您将只支持 IPv4,而 ptr->ai_family 可以是 AF_INETAF_INET6