我正在浏览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那样设置它?
此外,如果您有空闲时间并且了解插座,我将不胜感激。
答案 0 :(得分:2)
socket(ptr->ai_family,ptr->ai_socktype, ptr->ai_protocol);
传入变量来创建套接字,而不是对值进行硬编码。您获得的优势是代码适用于IPv4和IPv6。
ptr->ai_family
只是一个整数,是struct addrinfo的成员。 (如果您想知道ptr->
的特定语法,可以通过this question),它的值为AF_INET
或AF_INET6
(或理论上)任何其他支持的协议)
对getaddrinfo()
的调用将查找主机名,并将其解析为IPv4或IPv6,并将结果传递给socket()以创建正确类型的套接字。如果主机名解析为IPv4主机,则创建可以处理IPv4的套接字,如果解析为IPv6,则创建IPv6套接字。
如果你改为硬编码值,例如如AF_INET
,您只支持IPv4,而ptr->ai_family
可以是AF_INET
或AF_INET6
。