在網絡編程中, 常常會將網絡字節轉爲本地字節或者將本地字節轉爲網絡字節, 可是若是每次咱們都是都經過htonl
, ntohl
函數須要將10進制轉爲整數, 甚至還用將字符串轉爲整數, 再轉爲網絡字節, 或者反過來都是很麻煩的. 還好linux都是提供很方便的函數讓二者之間進行轉換.linux
linux提供了多種函數知足咱們任何轉換的需求, 這都是inet_xxx
族系列編程
#include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> int inet_aton(const char *ip, struct in_addr *inp); // 本地轉網絡 char * inet_ntoa(struct in_addr inp); // 網絡轉本地 in_addr_t inet_addr(const char *ip); // 返回網絡字節 in_addr_t inet_network(const char *ip); // 返回本地字節
接下來咱們來在分析一下這幾個函數安全
將點分十進制IP轉化爲網絡字節序存放在inp中, 並返回該網絡字節序對應的整數.網絡
int inet_aton(const char *ip, struct in_addr *inp);
失敗 : 返回0.socket
成功 : 返回IP對應的網絡字節序的數.函數
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/socket.h> // 傳入 127.0.0.1 int main(int argc, char *argv[]) { if(argc != 2) exit(-1); struct in_addr addr; if(inet_aton(argv[1], &addr) == 0) exit(-1); printf("0x%08x\n", addr.s_addr); // 0x0100007f exit(EXIT_SUCCESS); }
將一個32位網絡字節序的二進制IP地址轉換成相應的點分十進制的IP地址.線程
char *inet_ntoa(struct in_addr inp);
失敗 : 返回NULL.指針
成功 : 返回字符串指針.code
注意 : 該函數不是線程安全函數, 不可重入. 由於不一樣線程調用會覆蓋掉其餘線程的緩衝區.ip
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> int main(int argc, char *argv[]) { struct in_addr net_addr; net_addr.s_addr = 0x0100007f; // 127.0.0.1 char *host_addr; host_addr = inet_ntoa(net_addr); printf("%s\n", host_addr); // 127.0.0.1 exit(EXIT_SUCCESS); }
將一個點分十進制轉換網絡字節序IP.
in_addr_t inet_addr(const char *ip);
失敗 : 返回INADDR_NONE. 部分手冊上返回的是-1, 這個問題與inet_network
同樣了.
成功 : 返回網絡字節IP.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> // 輸入 127.0.0.1 int main(int argc, char *argv[]) { in_addr_t addr; addr = inet_addr(argv[1]); printf("0x%08x\n", addr); // 0x0100007f exit(EXIT_SUCCESS); }
將點分十進制IP轉化爲主機字節序
in_addr_t inet_network(const char *ip);
失敗 : 返回-1.
成功 : 返回主機對應的數.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> // 輸入 127.0.0.1 int main(int argc, char *argv[]) { in_addr_t addr; addr = inet_network(argv[1]); printf("0x%08x\n", addr); // 0x7f000001 exit(EXIT_SUCCESS); }
該函數在某些狀況下並不正確, 若是IP地址是255.255.255.255
返回的則是0xffffffff
, 轉爲十進制就是-1
. 分不清出-1
表示的是錯誤的返回值仍是IP地址. 可使用inet_pton()
和inet_ntop()
函數來代替, 這裏就不詳細的分析了, 有興趣的能夠本身查一下.
本節分析了4個函數, 重點須要掌握的是inet_aton
函數.
inet_network
返回值的問題inet_ntoa
並非線程安全的函數