網絡編程函數——字節序轉換函數和地址轉換函數

字節順序函數:
小端字節序:將低序字節存儲在起始地址。(linux)
大端字節序:將高序字節存儲在起始地址。(網絡字節序)
舉個例子:對於整數0x12345678來說,在不同的系統中存放的方式如下圖:

正是因爲網際協議採取的是大端字節序,我們在編程的時候才需要考慮網絡字節許和主機字節序之間的轉換。下面是四個轉換函數(在某些採用大端字節序的系統裏面,這四個函數被定位空宏):

 

  1. #include <netinet/in.h>  
  2. uint16_t htons(uint16_t host16bitvalue);  
  3. uint32_t htonl(uint32_t host32bitvalue);  //均返回網絡字節序  
  4. uint16_t ntohs(uint16_t net16bitvalue);  
  5. uint32_t ntohl(uint32_t net32bitvalue);   //均返回主機字節序  
 

 

地址轉換函數:
下面介紹兩組地址轉換函數。首先是第一組:

  1. #include <arpa/inet.h>  
  2. int   inet_aton(const char *strptr, struct in_addr *addrptr);  
  3.                                         //返回:1——串有效,0——串有錯  
  4. char* inet_ntoa(struct in_addr inaddr);  
  5.                                         //返回一個指向ASCII字串的指針  
  6. in_addr_t inet_addr(const char *strptr);  
  7.                                         //成功返回網絡字節序,錯誤返回INADDR_NONE  
 

 

接下來是第二組,這兩個函數比較新,對於IPv4和IPv6都能處理。p的含義是presentation,代表ASCII字串。n的含意是numberic,代表網絡地址值。

  1. #include <netinet/in.h>  
  2. #define INET_ADDRSTRLEN  16  
  3. #define INET6_ADDRSTRLEN 46  
  4. #include <arpa/inet.h>  
  5. int inet_pton(int family, const char *strptr, void *addrptr);  
  6.                                   //返回:1——成功,輸入的不是有效表達格式,-1——出錯  
  7. const char* inet_ntop(int family, const void *addrptr, char *strptr, size_t len);  
  8.                                   //返回:指向結果的指針——成功,NULL——出錯  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章