位元組序:
主機位元組序(host byte order):不同的主機有不同的位元組序,x86:小端; 網路位元組序(network byte order):大端位元組序;
0. 什麼是通訊端 通訊端是網路進程間的通訊(網路處理序間通訊,又叫 network IPC)介面,進程用該介面能夠與其他進程通訊,無論是否在同一台電腦上, 通訊端是對通訊端點的抽象,就像檔案描述符(file descriptor)是對檔案的抽象表示;
1. 基本概念
socket 可以看成是使用者進程(Application,工作在使用者空間)與核心網路通訊協定棧(核心空間,kernel space)的編程介面(稱為套介面); 以實現使用者空間的應用對核心網路通訊協定棧提供的服務的訪問和調用;
socket 以下的 UDP/TCP、IP、Channel 等即為核心網路通訊協定棧; 2. IPv4 通訊端地址介面
$ man 7 ip
IPv4 通訊端地址結構通常也稱為“網際通訊端地址結構”,以sockaddr_in命名,定義在 <netinet.h>中:
struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ in_port_t sin_port; /* port in network byte order */ struct in_addr sin_addr; /* internet address */};/* Internet address. */struct in_addr { uint32_t s_addr; /* address in network byte order */}; AF_INET:代表的是 IPv4 協議;
此外還有 Unix 域協議; Network byte order:網路位元組序;
3. 通用地址結構
使不同協議間的通訊端地址相容。
struct sockaddr { uint8_t sin_len; sa_family_t sin_family; char sa_data[14];} sin_len:整個 sockaddr 結構體的長度; sin_family:指定該地址家族; sa_data:由 sin_family 決定其形式;
4. 位元組序轉換函式
uint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);uint32_t ntohl(uint32_t hostlong);uint16_t ntohs(uint16_t hostshort);
h:host,表示主機(主機位元組序); n:network,表示網路(網路位元組序); s:short,l:long