任何人都知道我必须包含哪些标题才能使用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。
答案 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为目标。你可以在这里做至少三件事:
在stdafx.h
(如果有的话)中,找到WINVER
和_WIN32_WINNT
的定义[默认情况下这些都是0x0501
],更改它们都0x0600
。 Windows 7是0x0601
。另外,将NTDDI_VERSION
定义为0x06000000
。
如果您没有stdafx.h
标头,请将这些定义添加到项目的C / C ++预处理器设置(WINVER=0x0600,_WIN32_WINNT=0x0600,NTDDI_VERSION=0x06000000
)。
作为最后的手段,请在包含该特定源文件的任何标头之前手动定义:
#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>
另外,请确保您拥有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。