網絡字節轉換inet_aton & inet_ntoa & inet_addr和inet_pton & inet_ntop

今天被inet_ntoa 這個函數坑到了 留下個日誌 以後多加註意!
inet_ntop,這2個對IPV4和IPV6地址都能處理
       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <arpa/inet.h>

       int inet_aton(const char *cp, struct in_addr *inp);

       in_addr_t inet_addr(const char *cp);

       char *inet_ntoa(struct in_addr in);

inet_aton() converts the Internet host address cp from the standard
       numbers-and-dots notation into binary data and stores it in the struc‐
       ture that inp points to. inet_aton() returns non-zero if the address is
       valid, zero if not.

inet_aton() 轉換網絡主機地址cp爲二進制數值,並存儲在struct in_addr結構中,即第二個參數*inp,函數返回非0表示cp主機有地有效,返回0表示主機地址無效。

The inet_addr() function converts the Internet host address cp from
       numbers-and-dots notation into binary data in network byte order.   If
       the input is invalid, INADDR_NONE (usually -1) is returned. This is an
       obsolete interface to inet_aton(), described immediately above; it is
       obsolete   because   -1 is a valid address (255.255.255.255), and
       inet_aton() provides a cleaner way to indicate error return.
inet_addr函數轉換網絡主機地址(如192.168.1.10)爲網絡字節序二進制值,如果參數char *cp無效,函數返回-1(INADDR_NONE),這個函數在處理地址爲255.255.255.255時也返回-1,255.255.255.255是一個有效的地址,不過inet_addr無法處理;

The inet_ntoa() function converts the Internet host address in given in
       network byte order to a string in standard numbers-and-dots notation.
       The string is returned in a statically allocated buffer, which subse‐
       quent calls will overwrite.
inet_ntoa 函數轉換網絡字節排序的地址爲標準的ASCII以點分開的地址,,該函數返回指向點分開的字符串地址的指針,該字符串的空間爲靜態分配的,這意味着在第二次調用該函數時,上一次調用將會被重寫(覆蓋),所以如果需要保存該串最後複製出來自己管理!

現在一般使用inet_aton和inet_ntoa來處理網絡字節和主機字節之間的轉換;

有兩個更新的函數inet_pton和inet_ntop這2個函數能夠處理ipv4和ipv6,原型如下
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);

這個函數轉換字符串到網絡地址,第一個參數af是地址族,轉換後存在dst中
inet_pton 是inet_addr的擴展,支持的多地址族有下列:

AF_INET
       src爲指向字符型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函數將該地址
       轉換爲in_addr的結構體,並複製在*dst中

AF_INET6
      
src爲指向IPV6的地址,,函數將該地址
       轉換爲in6_addr的結構體,並複製在*dst中

如果函數出錯將返回一個負值,並將errno設置爲EAFNOSUPPORT,如果參數af指定的地址族和src格式不對,函數將返回0。

函數inet_ntop進行相反的轉換原型如下
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
這個函數轉換網絡二進制結構到ASCII類型的地址,參數的作用和上面相同,只是多了一個參數socklen_t cnt,他是所指向緩存區dst的大小,避免溢出,如果緩存區太小無法存儲地址的值,則返回一個空指針,並將errno置爲ENOSPC
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章