1. 程式人生 > >linux--IP地址轉換函式

linux--IP地址轉換函式

一、Linux下的地址結構

typedef uint32_t in_addr_t;

struct sockaddr

{

        unsigned short sa_family;

        char sa_data[14];

};

struct sockaddr_in

{

short  int sin_family;

unsigned short int sin_port;

struct in_addr sin_addr;       

unsigned char sin_zero[8];

};

struct in_addr

{

unsigned long s_addr;

};

struct in6_addr

{

uint8_t s6_addr[16]; /ipv6 address/ 

};

struct sockaddr_in6 

{

short int sin6_family;    /AF_INET6/

unsigned short int sin6_port;           /transport layer port #/

uint32_t sin6_flowinfo;        /ipv6 traffic class & flow info/

struct in6_addr sin6_addr;  /ipv6 address/

uint32_t sin6_scope_id;     /set of interfaces for a scope/

}

sin_family指代協議族,在socket程式設計中只能是AF_INET

sin_port儲存埠號(使用網路位元組順序)
sin_addr儲存IP地址,使用in_addr這個資料結構,s_addr按照網路位元組順序儲存IP地址
sin_zero是為了讓sockaddr與sockaddr_in兩個資料結構保持大小相同而保留的空位元組。

sockaddr_in和sockaddr是並列的結構,指向sockaddr_in的結構體的指標也可以指向
sockadd的結構體,並代替它。也就是說,你可以使用sockaddr_in建立你所需要的資訊,
在最後用進行型別轉換就可以了bzero((char*)&mysock,sizeof(mysock));//初始化

二、地址轉換

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

2.1 IP地址形式

210.25.132.181 是字串形式的IP地址;3524887733是整數形式的IP地址

2.2 地址轉換函式

2.2.1 字串-->整數形式

inet_addr、inet_network 和inet_aton都是將一個字串IP地址轉換成整數形式;

區別1:inet_addr和inet_aton轉換後的整數是網路位元組序;

       inet_network轉換後的整數是主機位元組序;

區別2:inet_addr和inet_network將255.255.255.255作為無效的IP地址

       inet_aton將255.255.255.255作為有效的IP地址(大多數路由器認為255.255.255.255是有效地址)

in_addr_tinet_addr (const char *cp); //cp是一個點分十進位制的IP地址,返回值unsigned long(網路位元組序) 

in_addr_t inet_network(const char *cp); //cp是一個點分十進位制的IP地址,返回值unsigned long(主機位元組序) 

int inet_aton(const char *string, struct in_addr*addr);//string是一個點分十進位制的IP地址,轉換後的IP地址放在addr(網路位元組序)中

2.2.2 整數形式-->字串

char *inet_ntoa(unsigned in_addr addr);//addr是主機位元組序,此函式的返回值會被下次呼叫返回值覆蓋

in_addr_t inet_lnaof(struct in_addr in);//獲取in(網路序)地址的主機ID(主機序)

in_addr_t inet_netof(struct in_addr_in);//獲取in(網路序)地址的網路ID(主機序)

struct in_addr inet_makeaddr(int net, int host);//將net是網路ID,host主機ID合併為一個新的IP地址

2.2.3 擴充套件函式

int inet_pton(int af, const char *src, void *dst);

“點分十進位制”-->二進位制整數

af:地址族 AF_INET 或者 AF_INET6

src:點分十進位制字串

dst:轉換後的二進位制整數儲存在dst中

返回值:成功1,引數無效0,錯誤-1

const char *inet_ntop(int af, const void *src, char *dst, int dstbuff_len);

二進位制整數-->“點分十進位制”

af:地址族 AF_INET 或者 AF_INET6

src:二進位制整數

dst:轉換後的點分十進位制字串

dstbuff_len: 快取區dst的大小,避免溢位,如果快取區太小去發儲存地址的值,返回空指標,errno置為ENOSPC。

返回值:成功返回字串首地址,錯誤返回NULL

三、主機序和網路序的轉換

資料:0x010203

大端模式,在記憶體中的儲存順序:

0x4000 0x4001 0x4002 

  01     02     03

小端模式,在記憶體中的儲存順序

0x4000 0x4001 0x4002 

  03     02     01

網路位元組序採用大端模式;

uint16_t htons(uint16_t hostshort) 主機序到網路序

uint32_t htonl(uint32_t hostlong)

uint16_t ntohs(uint16_t netshort) 網路序到主機序

uint32_t ntohl(uint32_t netlong)