遗留代码有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_socktype
和ai_protocol
成员怎么样?
SOCK_RAW
吗?IPPROTO_ICMP
(在标头中,而不是在MSDN中)?再次重复,结果IP地址将用于发送ICMP回应请求,因此我想知道是否需要RAW / ICMP?目前,IPv6并不担心。
答案 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中的端口成员。