IP地址转换函数
/*********************** 《Linux高性能服务器编程》游双 著 *******************************/ #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <assert.h> #include <stdio.h> #include <string.h> #include <iostream> using namespace std; /************************************* //#include <sys/un.h> struct sockaddr_un { sa_familiy_t sin_family;//地址族,AF_UNIX char sun_path[108];//文件路径 }; struct sockaddr_in { sa_family_t sin_family;//地址族:AF_INET u_int16_t sin_port; //端口号,要用网络字节序表示 struct in_addr sin_addr;//IPv4地址结构,见下面 }; struct in_addr { u_int32_t s_addr;//IPv4地址,要用网络字节序表示 }; struct sockaddr_in6 { sa_family_t sin6_family;//地址族:AF_INET6 u_int16_t sin6_port;//端口号,要用网络字节序表示 u_int32_t sin6_flowinfo;//流信息,应设置为0 struct in6_addr sin6_addr;//IPv6地址结构体,见下面 u_int32_t sin6_scope_id;//scope ID,尚处于试验阶段 }; struct in6_addr { unsigned char sz_addr[16];//IPv6地址,要用网络字节序表示 }; *****************************************/ int main() { //将用点分十进制字符串表示的IPv4地址转换为网络字节序整数表示的IPv4地址,失败返回INADDR_NONE // in_addr_t inet_addr(const char *); //完成和inet_addr同样的功能,但是将转换结果存储在 inp指向的地址结构中。成功返回1,失败返回0 // int inet_aton(const char( cp, struct in_addr* inp); //将网络字节序整数表示的IPv4地址转换为用点分十进制字符串表示的IPv4地址。 /////注意,该函数内部用了一个静态变量存储转化结果,函数的返回值指向该静态内存, //因此 inet_ntoa 是不可重入党。(不能连续调2次,第二次得到的值把地1次的值覆盖了。调用之后,最好把整个值单独取出来) // char *inet_ntoa(struct in_addr); // in_addr_t inet_addr(const char *); // int inet_aton(const char( cp, struct in_addr* inp); // char *inet_ntoa(struct in_addr); // inet_addr() in_addr_t ip1 = inet_addr("1.2.3.4"); printf("ip1:%d \r\n", ip1); struct in_addr ip2; int iResult = inet_aton("127.0.0.1",&ip2); printf("ip2:%d,iResult:%d \r\n", ip2, iResult);
struct in_addr myAddr1; struct in_addr myAddr2; myAddr1.s_addr = ip1; myAddr2.s_addr = ip2.s_addr; char* szValue1 = inet_ntoa(myAddr1); // printf("address1: %s \r\n", szValue1); char* szValue2 = inet_ntoa(myAddr2); printf("address2: %s \r\n", szValue2); printf("address1: %s \r\n", szValue1); system("pause"); return 0; }
(centos 下面编译运行)运行上面的程序,输出的结果如下:(第一次调用的 inet_ntoa的值被第二次调用的覆盖了)
ip1:67305985 ip2:16777343,iResult:1 address1: 127.0.0.1 address2: 127.0.0.1
总结一下:
(点分十进制的)ip地址字符串,转为 (网络字节序表示的ipv4地址)整数: in_addr_t ip1 = inet_addr("1.2.3.4"); printf("ip1:%d \r\n", ip1); (网络字节序表示的ipv4地址)整数,转为 (点分十进制的)ip地址字符串: struct in_addr myAddr1; char* szValue1 = inet_ntoa(myAddr1); printf("address2: %s \r\n", szValue2);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?