通用套接字地址結構
struct sockaddr
{
uint8_t sa_len;
sa_family_t sa_family; //協議族
char sa_data[4];
};
因爲有不同的網絡協議,對於bind函數時,就需要通用的套接字地址結構
IPv4套接字地址結構
struct in_addr
{
in_addr_t s_addr //32位的ipv4地址(網絡字節序存放)
};
struct sockaddr_in
{
uint8_t sin_len; //結構體長度
sa_family_t sin_family; //AF_INET
in_port_t sin_port; //16位的端口號
struct in_addr sin_addr; //32位ipv4地址
};
網絡字節序,主機字節序
網絡字節序就是大端模式。
主機字節序就是主機自己存放模式,即是大端模式,還是小端模式。
因爲在網絡中統一用網絡字節序,所以必要時需要進行網絡字節序與主機字節序的互相轉換。
轉換函數:
#include <netinet/in.h>
//host to network
uint16_t htons(uint16_t host16bitvalue);
unit32_t htonl(uint32_t host32bitvalue);
//netword to host
uint16_t ntohs(uint16_t net16bitvalue);
unit32_t ntohl(uint32_t nett32bitvalue);
點分十進制與二進制IP地址的轉換
對於ipv4地址
#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);
in_addr_t inet_addr(const char *strptr);
char *inet_ntoa(struct in_addr inaddr);
- inet_addr函數在出錯是會返回INADDR_NONE,通常是32位均爲1。
- inet_ntoa返回再靜態內存中,所以不可以重用
- inet_aton將strptr所指向的點分十進制轉成二進制ip地址,並存放在addrptr所指向的內存區域。
ipv4與ipv6都可用
int inet_pton(int family, const char *strptr, void *addrptr);
//成功返回1,若輸入不是有效的表達格式則爲0,出錯返回-1
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
//成功返回指向結果的指針,否則返回NULL
- inet_pton:指定了協議族family之後,將點分制strptr,轉爲二進制ip地址,並存放到addrptr所指向內存中。注意這裏addrptr是一個void *指針。
- inet_ntop將二進制ip地址轉爲數值格式,二進制ip地址存放在addrptr中,strptr存放的是裝換後的數值格式ip地址,len 表示目標存儲單元大小,一般是strptr的大小。