'inet_pton':找不到标识符

我试图在我的程序中包含下面的代码,但会出现错误('inet_pton':标识符未find)。

// IPv4: struct sockaddr_in ip4addr; int s; ip4addr.sin_family = AF_INET; ip4addr.sin_port = htons(3490); inet_pton(AF_INET, "10.0.0.1", &ip4addr.sin_addr); s = socket(PF_INET, SOCK_STREAM, 0); bind(s, (struct sockaddr*)&ip4addr, sizeof ip4addr); 

产量

  error C3861: 'inet_pton': identifier not found 

包括标题

  #include <stdio.h> #include <stdlib.h> #include "udpDefine.h" #include <windows.h> 

任何帮助可能会错过一些标题或库。

功能

 int inet_pton(int af, const char *src, void *dst); 

在头文件中声明:

 #include <arpa/inet.h> 

如果这是Windows(Vista或更高版本),则可以使用Winsock模拟此ANSI版本:

 INT WSAAPI InetPton( _In_ INT Family, _In_ PCTSTR pszAddrString, _Out_ PVOID pAddrBuf ); 

尝试#include <Ws2tcpip.h>添加Ws2_32.lib

在Windows XP(及更高版本)中,您可以使用这些功能:

 #include <stdlib.h> #include <string.h> #include <stdio.h> #include <winsock2.h> #include <ws2tcpip.h> int inet_pton(int af, const char *src, void *dst) { struct sockaddr_storage ss; int size = sizeof(ss); char src_copy[INET6_ADDRSTRLEN+1]; ZeroMemory(&ss, sizeof(ss)); /* stupid non-const API */ strncpy (src_copy, src, INET6_ADDRSTRLEN+1); src_copy[INET6_ADDRSTRLEN] = 0; if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) { switch(af) { case AF_INET: *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr; return 1; case AF_INET6: *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr; return 1; } } return 0; } 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; } 

与ws2_32库链接。

在我的情况下,功能找不到,因为有一个“#定义WINVER 0x0502”有些在头文件中。

在Windows系统上,此功能至少需要版本0x600(= Vista)。

要解决这个问题,只需在所有#includes后添加以下代码即可

 #pragma comment(lib, "ws2_32.lib")