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)