c++ inet

    技术2022-07-11  158

    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; }
    Processed: 0.030, SQL: 9