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;
}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐