网络编程学习一:IP地址转换函数
2021/11/1 22:10:37
本文主要是介绍网络编程学习一:IP地址转换函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
IP地址转换函数:inet_aton, inet_nota, inet_addr和inet_pton, inet_ntop
C中提供的点分十进制IP字符串与整数(二进制)表示的转化可以根据是否支持IPV6分为两类,第一类是仅支持IPV4的,包括,inet_aton,inet_nota,inet_addr。它们的声明及用法如下:
#include <arpa/inet.h> in_addr_t inet_addr(const char* strptr); int inet_aton(const char*cp, struct in_addr* inp); char* inet_ntoa( struct in_addr in); 其中in_addr为表示IPv4地址的结构体: struct in_addr { u_int32_t s_addr; }; 来自表示IPv4的socket: struct sockaddr_in { sa_family_t sin_family; //地址族 u_int16_t sin_port; //端口号 struct in_addr sin_addr; //IPv4地址结构体 }
具体用法:
#include <stdio.h> #include <arpa/inet.h> int main(){ char* ip = "127.0.0.1"; struct in_addr addr; //ip字符串转换为整数IP地址的两种方法 addr.s_addr = inet_addr(ip); inet_aton(ip, &addr); printf("%d\n",addr.s_addr); //整数ip转换为ip字符串 char* sz1 = inet_ntoa(addr); printf("%s\n", sz1); return 0; }
注意事项,inet_nota函数内部使用了一个静态变量存储转化结果,函数的返回值指向该静态内存,所以inet_nota是不可重入的。举例如下:
#include <arpa/inet.h> #include <stdio.h> int main(){ char* ip = "127.0.0.1"; char* ip2 = "172.22.1.2"; struct in_addr addr; struct in_addr addr2; inet_aton(ip, &addr); inet_aton(ip2, &addr2); char* sz1 = inet_ntoa(addr); char* sz2 = inet_ntoa(addr2); printf("%s\n", sz1); printf("%s\n", sz2); return 0; } /*输出结果 172.22.1.2 172.22.1.2 */
第二类为同时支持IPv4和IPv6。包括,inet_pton和inet_ntop。其定义如下:
#include <netinet/in.h> int inet_pton(int af, const char* src, void* dst); //返回:成功返回1;输入格式无效返回0;出错返回-1。 const char* inet_ntop(int af, const void* src, char* dst, socklen_t cnt); //返回:成功返回指向结果的指针;出错返NULL。 #define INET_ADDRSTRLEN 16 #define INET6_ADDRSTRLEN 46
其中各参数的含义如下:
-
af参数指定地址族。可选为:AF_INET和AF_INET6;
-
src为转换源,dst为转换目标。这里要注意的是,不能传给inet_ntop一个空指针,必须是一个已分配目标大小内存的指针。
-
cnt参数指定目标存储单位的大小。上面定义的两个宏可以帮助指定IPv4和IPv6的特定大小。
用法如下:
#include <arpa/inet.h> #include <stdio.h> int main(){ char* ip = "1.2.3.4"; struct in_addr addr; int i = 0; int *ad = &i; inet_pton(AF_INET, ip, ad); printf("%d\n", *ad); char ip2[INET_ADDRSTRLEN]; char* ip3 = inet_ntop(AF_INET, ad, ip2, INET_ADDRSTRLEN); printf("%s\n", ip2); printf("%s\n", ip3); return 0; }
这篇关于网络编程学习一:IP地址转换函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南