/*********************** 《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);