[英]C/C++ getnameinfo ai_family not supported only on macOS
[英]c++ - What does ptr->ai_family do vs AF_INET
我正在通过msdn的“ 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)
);
但是二进制程序“ Winsock教程 ”确实是这样的(他们正在使用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->
的特定语法,可以讨论这个问题 ),它将具有AF_INET
或AF_INET6
的值(或理论上任何其他受支持的协议)
调用getaddrinfo()
将查找主机名,并将其解析为IPv4或IPv6,然后将结果传递给socket()以创建适当类型的套接字。 如果主机名解析为IPv4主机,则创建一个可以处理IPv4的套接字;如果主机名解析为IPv6,则创建一个IPv6套接字。
如果改为将值硬编码(例如,作为AF_INET
,则仅支持IPv4,而ptr->ai_family
可以是AF_INET
或AF_INET6
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.