linux高性能服務器編程筆記 第5章 linux網絡編程基礎API

2020.04.29

字節序

字節序指的是數據的存儲格式。小端字節序將高位數據存儲在高地址,將低位數據存放在低地址處,大段字節序則相反。如數據0x0102,按地址由低向高擴展,小端字節序存儲爲02、01,大端字節序存儲爲01、02。
一般情況下PC採用小端字節序,爲了統一規範,發送端總是將要發送的數據轉換爲大端字節序數據在發送,接收端根據自身情況選擇轉換或者不轉換。
因此將小端字節序成爲主機字節序、大端字節序成爲網絡字節序。

socket地址

通用socket地址

#include<bits/socket.h>
struct sockaddr
{
	//協議族類型
	sa_family_t sa_family;
	//socket地址值
	char sa_sata[14];
}

在這裏插入圖片描述
不同協議族代表的不同含義及其長度:
在這裏插入圖片描述
由於舊的地址結構體無法存放足夠的地址值,linux定義的新的結構體:

#include<bits/socket.h>
struct sockaddr_storage
{
	sa_family_t sa_family;
	usingned long int __ss_aligh;
	char __ss_padding[128 - sizeof(__s_align)];
};

專用socket地址

unix本地域協議族:

#include<sys/un.h>
struct sockaddr_un
{
	sa_family_t sin_family;
	char sun_path[108];
};

TCP/IP協議族ipv4:

struct sockaddr_in
{
	//地址族
	sa_family_t sin_family;
	//端口號
	u_int16_t sin_port;
	//ipv4地址結構體
	struct in_addr sin_addr;
};
struct in_addr
{
	u_int32_t s_addr s_addr;
};

TCP/IP協議族ipv6:

struct sockaddr_in6
{
	sa_family_t sin6_family;
	u_int16_t sin6_port;
	//流信息,應設置爲0
	u_int32_t sin6_flowinfo;
	struct in6_addr sin6_addr;
	//scope ID,實驗階段
	u_int32_t sin6_scope_id;
};
struct in6_addr
{
	unsigned char sa_addr[16];
};

所用的專用socket地址結構體包括sockaddr_storage類型的變量在使用時都要轉化爲通用socket地址類型sockaddr,因爲socket接口地址參數都是sockaddr。

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