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);