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_INET
或 AF_INET6
的值(或者理论上任何其他支持的协议)
对 getaddrinfo()
的调用将查找主机名,并将其解析为 IPv4 或 IPv6,然后将结果传递给 socket() 以创建正确类型的套接字。如果主机名解析为 IPv4 主机,则创建一个可以处理 IPv4 的套接字,如果它解析为 IPv6,则创建一个 IPv6 套接字。
如果您改为对值进行硬编码,例如作为 AF_INET
,您将只支持 IPv4,而 ptr->ai_family
可以是 AF_INET
或 AF_INET6
。
我正在浏览 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_INET
或 AF_INET6
的值(或者理论上任何其他支持的协议)
对 getaddrinfo()
的调用将查找主机名,并将其解析为 IPv4 或 IPv6,然后将结果传递给 socket() 以创建正确类型的套接字。如果主机名解析为 IPv4 主机,则创建一个可以处理 IPv4 的套接字,如果它解析为 IPv6,则创建一个 IPv6 套接字。
如果您改为对值进行硬编码,例如作为 AF_INET
,您将只支持 IPv4,而 ptr->ai_family
可以是 AF_INET
或 AF_INET6
。