1

我正在尝试实现一个名为“inet_pton”的函数,它将 IPv4 或 IPv6 的字符串表示(如“66.102.1.147”[google])转换为二进制网络字节有序形式。这是我的代码的相关部分:

#if defined WIN32
int inet_pton (int af, const char *src, void *dst)

{
    const void *data;
    size_t      len;
    struct      addrinfo hints, *res;

    hints.ai_family   = af;
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_UDP;
    hints.ai_flags    = AI_NUMERICHOST;

    if (getaddrinfo (src, NULL, &hints, &res))
    {
        std::cout << "ERROR : inet_pton() in " << __FILE__ << " at line " << __LINE__ << std::endl;
        std::cout << "      : getaddrinfo() failed to get IP address info for \"" << src << "\"" << std::endl;
        return 0;
    }
...

所以 src 是传入的 IP 字符串。但是,我总是收到类似的错误

getaddrinfo() 无法获取“66.102.1.147”的 IP 地址信息

有winsock经验的人可以评论吗?我还尝试了另一种方法,函数

WSAStringToAddress ((LPTSTR)src, af, NULL, (LPSOCKADDR) &sa, &address_length)

但它总是返回错误代码 WSAEINVAL,表示 IP 字符串无效。这对我来说毫无意义。我使用 VS2005 作为我的 IDE。

4

4 回答 4

4

好吧,首先,您要求使用 UDP 作为协议的流套接字,而这不会发生。

尝试:

hints.ai_family   = af;
hints.ai_socktype = 0; 
hints.ai_protocol = 0;
hints.ai_flags    = AI_NUMERICHOST;

并首先将其 memset 为零,因为它具有您未设置的额外成员...

同样在我的代码中,当我没有空字符串而不是空时,我为端口或服务传递了一个空字符串。文档似乎没有指定当您没有值时要做什么;但无论哪种方式,一个空字符串都对我有用。

哦,和往常一样,在这些情况下,知道 WSAGetLastError() 返回什么值会很有用......

于 2009-02-13T19:12:04.800 回答
2

MSDN 有一篇关于使用 getaddrinfo 的优秀文章:

http://msdn.microsoft.com/en-us/library/ms738520(VS.85).aspx

甚至还有一个使用 AI_NUMERICHOST 的示例,这听起来像是您需要的。他们设置他们的“提示”结构与你有点不同:

ZeroMemory(&hints, sizeof(hints));
hints.ai_flags = AI_NUMERICHOST;
hints.ai_family = AF_UNSPEC;

他们不设置其他 2 个属性。也许这会有所帮助?

于 2009-02-13T19:10:49.017 回答
2

您为 af 传递的值是多少?我有一些代码可以做同样的事情,我和你的唯一区别是:

  • 我将提示结构设置为 0
  • 我总是通过PF_UNSPECai_family
  • 我使用IPPROTO_TCP而不是IPPROTO_UDP.
于 2009-02-13T19:13:49.650 回答
1

您也可以使用libcurl作为参考。重新发明轮子并不总是必要的。

于 2009-02-13T19:17:51.557 回答