c++ inet_pton和inet_ntop在windows下用不了咋办?
这两个函数是ip地址和字符串的互转函数,查询百度在“在百度百科”中提示:只要
包含 #include <WS2tcpip.h>头文件即可。然而在codeblocks亲测却是不行的,提示:D:\C++_work\test\test.cpp|16|error: ‘inet_ntop’ was not declared in this scope|
意思就是这个函数在没有定义。
vs我没有安装,不确定vs下是否有。那么咋办呢?查询发现win下可用以下两个函数代替:
WSAAddressToStringA 和WSAStringToAddress。这两个函数用法类似,我们以WSAAddressToStringA函数说明,其函数语法如下:
INT WSAAPI WSAAddressToStringA(
LPSOCKADDR lpsaAddress, // sockaddr类型指针
DWORD dwAddressLength, //地址长度
LPWSAPROTOCOL_INFOA lpProtocolInfo, //地址协议指针
LPSTR lpszAddressString, //转换后字符串地址
LPDWORD lpdwAddressStringLength //函数返回的字符串长度
);
如果没有错误发生,则 WSAAddressToString返回零值。否则,将返回值SOCKET_ERROR,并且可以通过调用WSAGetLastError来检索特定的错误号 。
以下为代码实例,在win7下直接运行,注意查看端口号为0和不为0时字符串的不同
/*
ipv6 address to string or string to ipv6 address;
Edited by Mr Zhu,email:40222865@qq.com or weixin:40222865
*/
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
using namespace std;
int main()
{
WSADATA wsa_data;
WORD sockversion = MAKEWORD(2,2);
if(WSAStartup(sockversion, &wsa_data) != 0)
{
return 0;
}
struct sockaddr_in6 ser_addr;
int addr_size=sizeof(struct sockaddr_in6);
char ip_addr[100]="";
DWORD string_leng=100;
int i;
WSAStringToAddress( (LPSTR)"ff::1:ff:1",
AF_INET6,
NULL,
(LPSOCKADDR) &ser_addr,
&addr_size );
printf("16进制ip地址是:");
for(i=0;i<15;i=i+2)
{
printf("%x%x:",ser_addr.sin6_addr.u.Byte[i],ser_addr.sin6_addr.u.Byte[i+1]);
}
ser_addr.sin6_port=htons(5240);
WSAAddressToStringA(
(LPSOCKADDR)&ser_addr, // sockaddr类型指针
addr_size, //地址长度
NULL, //地址协议指针
(LPSTR) ip_addr, //转换后字符串地址
&string_leng //函数返回的字符串长度
);
printf("\nipv6 address is\"%s\"\n",ip_addr);
memset(ip_addr,0,100);
ser_addr.sin6_port=htons(0);
WSAAddressToStringA(
(LPSOCKADDR)&ser_addr, // sockaddr类型指针
addr_size, //地址长度
NULL, //地址协议指针
(LPSTR) ip_addr, //转换后字符串地址
&string_leng //函数返回的字符串长度
);
printf("\n端口为0后显示 address is\"%s\"\n",ip_addr);
return 1;
}