c++ inet_pton和inet_ntop在windows下用不了咋办?

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;
}
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
inet_ptoninet_ntop是用于IP地址转换的两个函数,分别用于将点分十进制的IPv4地址转换成网络字节序的二进制形式和将网络字节序的二进制形式的IPv4地址转换成点分十进制形式。 下面是它们的实现: ```c #include <arpa/inet.h> #include <string.h> int inet_pton(int af, const char *src, void *dst) { if (af == AF_INET) { struct in_addr addr; if (inet_aton(src, &addr) == 0) { return 0; } memcpy(dst, &addr.s_addr, sizeof(addr.s_addr)); return 1; } else if (af == AF_INET6) { struct in6_addr addr; if (inet_pton(AF_INET6, src, &addr) == 0) { return 0; } memcpy(dst, &addr, sizeof(addr)); return 1; } return -1; } const char *inet_ntop(int af, const void *src, char *dst, socklen_t size) { if (af == AF_INET) { struct in_addr addr; memcpy(&addr.s_addr, src, sizeof(addr.s_addr)); if (inet_ntop(AF_INET, &addr, dst, size) == NULL) { return NULL; } return dst; } else if (af == AF_INET6) { struct in6_addr addr; memcpy(&addr, src, sizeof(addr)); if (inet_ntop(AF_INET6, &addr, dst, size) == NULL) { return NULL; } return dst; } return NULL; } ``` 对于inet_pton函数,我们首先判断地址族af是否为IPv4或IPv6,然后根据不同的地址族调用inet_aton或inet_pton进行转换。如果转换成功,则将转换后的二进制地址复制到dst指针所指向的内存中,并返回1;否则返回0表示转换失败。 对于inet_ntop函数,我们同样首先判断地址族af是否为IPv4或IPv6,然后根据不同的地址族调用inet_ntop进行转换。如果转换成功,则将转换后的点分十进制地址复制到dst指针所指向的内存中,并返回dst指针;否则返回NULL表示转换失败。需要注意的是,目标内存大小size应该足够存放转换后的地址。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值