遗留代码有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并不是一个担忧。
发布于 2015-08-19 09:29:13
关于getaddrinfo的文档,您可以将此字段保留为空(0)。
ai_socktype的值为零,表示调用方将接受任何套接字类型。 ai_protocol的值为零,表示调用方将接受任何协议。
IPv4和IPv6地址不取决于是否用于流或特定的协议类型。因此,对于调用IcmpSendEcho,只需忽略这个字段。
编辑:
只有在指定服务名称时,套接字类型和协议提示才可能相关。服务名称可以是"http“、" tftp”等。例如,如果指定"tftp“服务,则不能设置”流“套接字类型,因为tftp是基于数据报的。但在您的情况下(而且可能是其他时间),服务字段将被保留为空。例如,如果您指定了"http“服务,那么ai_addr.sin_port中的端口成员也应该被填充。
https://stackoverflow.com/questions/32089050
复制相似问题