[學習筆記]套接字地址結構

  套接字函數需要一個指向套接字地址結構的指針作爲參數。每個協議定義有屬於自己的套接字地址結構,均以“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 ,剛開始接觸網絡編程,對於數據類型有點迷惑。
詢問度娘:就是一個結構的標註,可以理解爲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;	//標識地址範圍 
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章