InetNtop:无法找到它正在使用的标头

时间:2011-02-03 19:32:34

标签: c++

任何人都知道我必须包含哪些标题才能使用InetNtop功能?
我试过winsock2.h,ws2tcpip.h并且我已经包含了Ws2_32 librabry。我正在使用Windows 7 这是我得到编译时的错误:InetNtop:函数无法解析

编辑:
char temp[10];
int bytes_recv = Recv(temp, sizeof(temp));
char result[INET_ADDRSTRLEN];
InetNtop(AF_INET, (void*)(&temp[4]), result, sizeof(result));

我正在尝试打印一个临时的IP。

5 个答案:

答案 0 :(得分:3)

根据其documentation Ws2tcpip.h是其实际的头文件。

编辑:

根据文档,使用此函数需要为Windows Vista或更高版本编译代码。由于 包含必要的标题,但函数不可见,我猜你没有设置正确的定义或编译器选项来编译合适版本的代码。

您使用的实际Windows版本并不重要 - 您正在编译的内容(即目标版本)是。

编辑2:

您应该按照here所述添加正确的#define指令,以指明您要编译的Windows版本。 E.g。

#include <SdkDdkver.h>

#define NTDDI_VERSION NTDDI_VISTA
#define WINVER _WIN32_WINNT_VISTA
#define _WIN32_WINNT _WIN32_WINNT_VISTA

其中一些定义了重叠,可能不需要,但在我为Windows编码的极少数情况下,我只是使用它们来确保: - )

编辑3:

MinGW / GCC的情况有点不同:

#include <w32api.h>

#define WINVER                  WindowsVista
#define _WIN32_WINDOWS          WindowsVista
#define _WIN32_WINNT            WindowsVista

注意:这些定义应放在包括Windows.h或除w32api.h之外的任何其他标题之前。

编辑4:

从Visual Studio 2010中的WS2tcpip.h

#if (NTDDI_VERSION >= NTDDI_VISTA)
.
.
.
PCSTR
WSAAPI
inet_ntop(
    __in                                INT             Family,
    __in                                PVOID           pAddr,
    __out_ecount(StringBufSize)         PSTR            pStringBuf,
    __in                                size_t          StringBufSize
    );

PCWSTR
WSAAPI
InetNtopW(
    __in                                INT             Family,
    __in                                PVOID           pAddr,
    __out_ecount(StringBufSize)         PWSTR           pStringBuf,
    __in                                size_t          StringBufSize
    );

#define InetPtonA       inet_pton
#define InetNtopA       inet_ntop

#ifdef UNICODE
#define InetPton        InetPtonW
#define InetNtop        InetNtopW
#else
#define InetPton        InetPtonA
#define InetNtop        InetNtopA
#endif
.
.
.
#endif  //  (NTDDI_VERSION >= NTDDI_VISTA)

因此,在这种情况下,关键定义是NTDDI_VERSION,正如新API添加所预期的那样。

我在MinGW32 / GCC-4.4.2中找不到InetNtop定义,因此你的版本很可能不支持它。

答案 1 :(得分:3)

不是100%相关,但对于此调用的linux / unix版本(inet_ntop(...)),您需要#include <arpa/inet.h>

答案 2 :(得分:1)

虽然它存在于Ws2tcpip.h中,但大多数项目的默认目标是Windows XP,并且您尝试使用的功能是在Vista中引入的,因此,您需要将项目配置为以Vista为目标。你可以在这里做至少三件事:

  1. stdafx.h(如果有的话)中,找到WINVER_WIN32_WINNT的定义[默认情况下这些都是0x0501],更改它们都0x0600。 Windows 7是0x0601。另外,将NTDDI_VERSION定义为0x06000000

  2. 如果您没有stdafx.h标头,请将这些定义添加到项目的C / C ++预处理器设置(WINVER=0x0600,_WIN32_WINNT=0x0600,NTDDI_VERSION=0x06000000)。

  3. 作为最后的手段,请在包含该特定源文件的任何标头之前手动定义:

    #ifndef WINVER
    #define WINVER 0x0600
    #endif
    #ifndef _WIN32_WINNT
    #define _WIN32_WINNT 0x0600
    #endif
    #ifndef NTDDI_VERSION
    #define NTDDI_VERSION 0x06000000
    #endif
    #include <windows.h>
    #include <Ws2tcpip.h>
    
  4. 另外,请确保您拥有ws2tcpip.h的最新副本。例如,Visual Studio 2005附带的副本没有InetNtop的声明。

答案 3 :(得分:1)

在您的代码中显式声明此函数。

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size)
{
  struct sockaddr_storage ss;
  unsigned long s = size;

  ZeroMemory(&ss, sizeof(ss));
  ss.ss_family = af;

  switch(af) {
    case AF_INET:
      ((struct sockaddr_in *)&ss)->sin_addr = *(struct in_addr *)src;
      break;
    case AF_INET6:
      ((struct sockaddr_in6 *)&ss)->sin6_addr = *(struct in6_addr *)src;
      break;
    default:
      return NULL;
  }
  /* cannot direclty use &size because of strict aliasing rules */
  return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, &s) == 0)?
          dst : NULL;
} 

答案 4 :(得分:0)

看起来像Ws2tcpip.h,请参阅msdn