【问题标题】:c++ - What does ptr->ai_family do vs AF_INETc++ - ptr->ai_family 对 AF_INET 做了什么
【发布时间】:2017-01-20 15:09:59
【问题描述】:

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

另外,如果您有空闲时间并且熟悉套接字,我将不胜感激。

【问题讨论】:

  • 你没有表现出ptr这么难说的东西。
  • @SamiKuhmonen aahhh 是的,刚刚编辑。

标签: c++ sockets winsock winsock2


【解决方案1】:
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

【讨论】:

  • 谢谢!这是可以理解的!到目前为止,我还没有找到一个易于理解的关于 winsock XD 主题的教程。
猜你喜欢
  • 2013-04-08
  • 2013-05-12
  • 2018-10-16
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多