套接字函數需要一個指向套接字地址結構的指針作爲參數。每個協議定義有屬於自己的套接字地址結構,均以“sockaddr”開頭,
例如:1、IPv4套接字地址結構以 “ sockaddr_in ”命名
2、IPv6套接字地址結構以 " sockaddr_in6 ” 命名
1、通用套接字地址結構
現在一般不用了,用途:對指向特定協議的套接字地址結構的指針進行強制類型轉換。
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;/*協議族地址類型*/
char sa_data[14];/*存儲具體協議地址*/
};
2、IPv4 地址結構
先定義一個結構體用來表示32位IPv4地址
struct in_addr{
in_addr_t s_addr;//用來表示32位IPv4地址
};
in_addr_t 一般爲 32位的unsigned int,其字節順序爲網絡順序(network byte ordered),即該無符號整數採用大端字節序。.其中中每8位代表一個IP地址位中的一個數值.
例如192.168.3.144記爲0x 90 03 a8 c0,其中 c0 爲192 ,a8 爲 168, 03 爲 3 , 90 爲 144。打印的時候調用inet_ntoa()函數將其轉換爲char *類型。解惑:*_t ,剛開始接觸網絡編程,對於數據類型有點迷惑。
32位IPv4地址結構有兩種訪問方法:例如serv定義爲某套接字地址結構:1、serv.sin_addr 將in_addr結構來引用32位IPv4,2、serv.sin_addr.s_addr將按照in_addr_t(無符號32位整數)來引用。
詢問度娘:就是一個結構的標註,可以理解爲type/typedef的縮寫,表示它是通過typedef定義的,而不是其它數據類型。
struct sockaddr_in{
uint8_t sin_len;/*爲了增加OSI協議支持增加的,簡化了長度可變套接字地址結構處理 */
sa_family_t sin_family;/*地址族*/
in_port_t sin_port; /*16位TCP or UDP端口號*/
struct in_addr sin_addr; /*32位IP地址*/
char sin_zero[8];/* 未使用,置爲0*/
};
32位IPv4地址結構有兩種訪問方法:例如serv定義爲某套接字地址結構:1、serv.sin_addr 將in_addr結構來引用32位IPv4,2、serv.sin_addr.s_addr將按照in_addr_t(無符號32位整數)來引用。
3、IPv6地址結構
struct in6_addr
{
uint8_t s6_addr[16]; //按照網絡字節順序存儲128位IPv6地址
};
#DEFINE SIN6_LEN
struct sockaddr_in6
{
uint8_t sin6_len; //IPv6結構長度,是一個無符號的8爲整數,表示128爲IPv6地址長度
sa_family_t sin6_family; //地址族AF_INET6
in_port_t sin6_port; //存儲端口號,按網絡字節順序
uint32_t sin6_flowinfo; //低24位是流量標號,然後是4位的優先級標誌,剩下四位保留
struct in6_addr sin6_addr; //IPv6地址,網絡字節順序
uint32_t sin6_scope_id; //標識地址範圍
};