首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将gethostbyname替换为ICMP (IcmpSendEcho)的getaddrinfo

将gethostbyname替换为ICMP (IcmpSendEcho)的getaddrinfo
EN

Stack Overflow用户
提问于 2015-08-19 07:26:40
回答 1查看 2.3K关注 0票数 1

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

代码语言:javascript
复制
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并不是一个担忧。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-19 09:29:13

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

ai_socktype的值为零,表示调用方将接受任何套接字类型。 ai_protocol的值为零,表示调用方将接受任何协议。

IPv4和IPv6地址不取决于是否用于流或特定的协议类型。因此,对于调用IcmpSendEcho,只需忽略这个字段。

编辑:

只有在指定服务名称时,套接字类型和协议提示才可能相关。服务名称可以是"http“、" tftp”等。例如,如果指定"tftp“服务,则不能设置”流“套接字类型,因为tftp是基于数据报的。但在您的情况下(而且可能是其他时间),服务字段将被保留为空。例如,如果您指定了"http“服务,那么ai_addr.sin_port中的端口成员也应该被填充。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32089050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档