UNIX網路程式設計(6)--套接字地址結構、通用套接字地址結構

pengfoo發表於2012-03-23
#include <netinet/in.h>

/**IPV4套接字地址結構**/
struct in_addr
{
	in_addr s_addr;//32位IPV4地址,這是無符號整數,網路位元組序
};

/*POSIX只關注sin_family,sin_port,sin_addr,所有網路套接字地質結構都至少16位元組*/
struct sockaddr_in
{
	uint8_t sin_len;//無符號八位整形,套接字地址長度(16位元組)
	sa_family_t sin_family;//unsigned short
	in_port_t sin_port;//16位TCP、UDP埠號,網路位元組序
	struct in_addr sin_addr;//32位IPV4地址,這是個結構,網路位元組序
	char sin_zero[8];//未使用
};

#include <sys/socket.h>
/***通用套接字地址結構***/
struct sockaddr
{
	uint8_t sa_len;
	sa_family_t sa_family;//地址族,AF_XXX
	char sa_data[14];//與協議相關的地址
};


#include <netinet/in.h>
/***IPV6套接字地址結構****/
struct in6_addr
{
	uint8 s6_addr[16];//128位IPV6地址,整數,網路位元組序
};

#define SIN6_LEN//支援sin6_len的地址必須定義
struct sockaddr_in6
{
	uint8_t sin6_len;//套接字地址長度(28位元組)
	sa_family_t sa6_family;//AF_INET6
	in_port_t sin6_port;//埠

	uint32 sin6_flowinfo;//流標,未定義
	struct in6_addr sin6_addr;//IPV6地址,結構體

	uint32_t sin6_scope_id//?;
};

/***新的通用套接字地址結構***/
struct sockaddr_storage
{
	uint8_t ss_len;//本結構體的長度
	sa_family_t ss_family;//地址族,AF_XXX
	//可能還有其他欄位
};

/**Unix域套接字結構**/
#include <sys/un.h>
struct sockaddr_un
{
	sa_family_t sun_family;/*AF_LOCAL*/
	char sun_path[104];//路徑名字串
};

/***資料鏈路套接字地址***/
#include <net/if_dl.h>//interface
struct sockaddr_dl
{
	uint8_t sdl_len;
	sa_family_t sdl_family;//AF_LINK
	uint16_t sdl_index;//>0,????
	uint8_t sdl_type;//IFT_ETHER,ect.????
	uint8_t sdl_nlen;//介面名稱長度
	uint8_t sdl_alen;//鏈路層地址長度
	uint8_t sdl_slen;//鏈路層selector長度。??
	char sdl_data[12];//介面名字(從sdl_data[0]開始)和鏈路層地址(從sdl_data[sdl_nlen]開始)
};

相關文章