【问题标题】:Is there an alternative to inet_ntop / InetNtop in Windows XP?Windows XP 中是否有替代 inet_ntop / InetNtop 的方法?
【发布时间】:2009-10-13 16:44:51
【问题描述】:

我正在尝试编译 beej 的网络编程示例指南,但 Windows XP 没有这样的功能。我正在使用 mingw,如果它有什么不同的话。

【问题讨论】:

  • Windows Phone 8.1 上的 Winsock 实现中也缺少 inet_ntop。 MS 怎么可能希望这样一个残缺的平台取得成功?
  • 是的,而且在 Windows CE 7 中也没有。

标签: c++ windows networking


【解决方案1】:

来自 WinSock 层:

【讨论】:

  • 请注意,WSAAddressToString 也会附加端口号,如果您的地址结构有一个。因此,要获取 IP,您可能必须创建一个没有端口的新地址。
【解决方案2】:

如果您只处理 IPv4 地址,则可以使用 inet_ntoa。它在 Windows 2000 或更高版本上可用。否则你必须要么需要 Vista 和更高版本,要么编写自己的 inet_ntop 函数。

您还可以查看 boost - boost::asio 有一个在 Windows 中工作的 inet_ntop 实现:boost::asio::detail::socket_ops::inet_ntop。可以看源码here

【讨论】:

  • inet_ntoa 在每个带有 WinSock2 的 Windows 版本上都可用,在最低版本方面你不能相信 MSDN,他们似乎忘记了 Win9x 和 NT4
  • MinGW 标头不包含 inet_ntop 的声明。所以即使在 Windows Vista 和更高版本上你也不能使用它:(
【解决方案3】:

POSIX compliant libc for Windows (PlibC) 库中还有 inet_ntop 函数,它是为将 POSIX 应用程序移植到 Windows 而创建的。 online documentation 中没有关于它的注释,但至少自 2008 年以来它存在于文件 inet_ntop.c 中(根据文件日期)。

const char * inet_ntop(int af, const void *src, char *dst, size_t size)

【讨论】:

    【解决方案4】:

    您可以在 Windows 7 上将 winsocket 与 mingw-64 一起使用

    #include <winsock2.h>
    #include <windows.h>
    #include <ws2tcpip.h>
    

    链接

    gcc showip.c -lws2_32
    

    目标:x86_64-w64-mingw32 线程型号:win32 gcc 版本 6.3.0 (GCC)

    【讨论】:

      【解决方案5】:

      您可能想要使用 Jeroen Massar 提供的东西 here,他的帖子摘录如下:

      const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
      {
          if (af == AF_INET)
          {
              struct sockaddr_in in;
              memset(&in, 0, sizeof(in));
              in.sin_family = AF_INET;
              memcpy(&in.sin_addr, src, sizeof(struct in_addr));
              getnameinfo((struct sockaddr *)&in, sizeof(struct
                  sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST);
              return dst;
          }
          else if (af == AF_INET6)
          {
              struct sockaddr_in6 in;
              memset(&in, 0, sizeof(in));
              in.sin6_family = AF_INET6;
              memcpy(&in.sin6_addr, src, sizeof(struct in_addr6));
              getnameinfo((struct sockaddr *)&in, sizeof(struct
                  sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST);
              return dst;
          }
          return NULL;
      }
      
      

      【讨论】:

      • 它工作,你真的是一个救生员,谢谢。在尝试修复vs2008中inet_ntop的编译错误后,这个是完美的答案。
      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2021-11-06
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多