Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将ICMP(IcmpSendEcho)的gethostbyname替换为getaddrinfo_C++_Windows_Winapi_Winsock2_Icmp - Fatal编程技术网

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_协议
成员如何

  • 插座类型是否应为原始插座
  • 协议应该是
    IPPROTO\U ICMP
    (在标题中,而不是在MSDN中)

再次重复,结果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
实现的更多信息。