C++ 将ICMP(IcmpSendEcho)的gethostbyname替换为getaddrinfo
传统代码使用C++ 将ICMP(IcmpSendEcho)的gethostbyname替换为getaddrinfo,c++,windows,winapi,winsock2,icmp,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_sock
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;
}
DWORD getipaddress(const char*pAddress)
{
PADDRINFOA addr=nullptr;
addrinfo提示={0};
hits.ai_family=AF_INET;
//hints.ai_socktype=??;
//hits.ai_协议=??;
getaddrinfo(pAddress、nullptr、提示和addr);
自动sockaddr\u ipv4=重新解释强制转换(addr->ai\u addr);
返回sockaddr\u ipv4->sin\u addr.S\u un.S\u addr;
}
我的问题是:ai_socktype
和ai_协议
成员如何
- 插座类型是否应为原始插座
- 协议应该是
(在标题中,而不是在MSDN中)IPPROTO\U ICMP
再次重复,结果IP地址将用于发送ICMP回显请求,因此我想知道是否需要RAW/ICMP?目前,IPv6并不令人担忧。关于getaddrinfo的文档,您可以将此字段留空(0) ai_socktype的值为零表示调用方将接受任何套接字类型 ai_协议的值为零表示调用者将接受任何协议 IPv4和IPv6地址不取决于是用于流还是特定协议类型。因此,调用
IcmpSendEcho
只需忽略此字段
编辑:
只有在指定了服务名称时,套接字类型和协议提示才可能相关。服务名称可以是“http”、“tftp”等。例如,如果指定“tftp”服务,则无法设置“流”套接字类型,因为tftp是基于数据报的。但在您的情况下(可能是大多数其他时间),服务字段保留为空。例如,如果您指定“http”服务,那么ai_addr.sinu port中的端口成员也应该填写。我在文档中读到了这一部分,但我对“any”一词感到困惑。这是否意味着
getaddrinfo
将返回所有原型/套接字类型的IP?由于getaddrinfo
提供了“从ANSI主机名到地址的协议独立转换”,并且由于IPv4地址不会因特定协议或套接字类型而改变,因此应忽略协议和套接字类型提示,因此,getaddrinfo
可以应用哪些智能。但是,如文档中所述,我会将其设置为零(表示接受任何),否则可能会返回类似EAI_SOCKTYPE
的错误(未测试)。@Ajay您可以在RFC 2553中找到有关getaddrinfo
实现的更多信息。