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。