c ++ - ptr-> ai_family对AF_INET做了什么

时间:2016-09-13 05:39:19

标签: c++ sockets winsock winsock2

我正在浏览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那样设置它?

此外,如果您有空闲时间并且了解插座,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

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

ptr->ai_family只是一个整数,是struct addrinfo的成员。 (如果您想知道ptr->的特定语法,可以通过this question),它的值为AF_INETAF_INET6(或理论上)任何其他支持的协议)

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

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