gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:01:13 26 4
gpt4 key购买 nike

我正在浏览 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 的一个成员. (如果您想知道 ptr-> 的特定语法,您可以查看 this question ),它的值将是 AF_INET AF_INET6(或者理论上任何其他支持的协议(protocol))

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

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

关于c++ - ptr->ai_family 与 AF_INET 相比有何作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39462861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com