将gethostbyname替换为ICMP的getaddrinfo(IcmpSendEcho)

时间:2015-08-19 07:26:41

标签: c++ windows winapi winsock2 icmp

遗留代码有gethostbyname来获取主机的IP地址。转换后的地址的整数部分然后传递给IcmpSendEcho。 我正在用getaddrinfo替换这个过时的函数。

DWORD GetIPAddressInt(const char* pAddress)
{
    PADDRINFOA addr = nullptr;    
    addrinfo hints = { 0 };

    hints.ai_family = AF_INET;    
    // hints.ai_socktype = ??;
    // hints.ai_protocol = ??;
    getaddrinfo(pAddress, nullptr, &hints, &addr);

    auto sockaddr_ipv4 = reinterpret_cast<sockaddr_in*>(addr->ai_addr);

    return sockaddr_ipv4->sin_addr.S_un.S_addr;
}

我的问题是:ai_socktypeai_protocol成员怎么样?

  • 套接字类型应为SOCK_RAW吗?
  • 协议应该是IPPROTO_ICMP(在标头中,而不是在MSDN中)?

再次重复,结果IP地址将用于发送ICMP回应请求,因此我想知道是否需要RAW / ICMP?目前,IPv6并不担心。

1 个答案:

答案 0 :(得分:1)

关于 getaddrinfo 的文档,您可以将此字段留空(0)。

  

ai_socktype的值为零表示调用者将接受任何套接字类型。

     

ai_protocol的值为零表示调用者将接受任何协议。

IPv4和IPv6地址不取决于是用于流还是特定协议类型。因此,要调用IcmpSendEcho,请忽略此字段。

修改

仅当指定了服务名称时,套接字类型和协议提示才可能相关。服务名称可以是&#34; http&#34;,&#34; tftp&#34;如果你指定&#34; tftp&#34;例如,你不能设置&#34; stream&#34;套接字类型,因为tftp是基于数据报的。但在您的情况下(可能是大多数其他时间)服务字段保留为NULL。如果你指定&#34; http&#34;例如,服务也应该填充ai_addr.sin_port中的端口成员。