套接字程式設計都會用到套接字位址,這裡講述一些基本的系統呼叫函式,非常的簡單,這裡可以好好思考。呼叫函式給被呼叫函式分配空間,然後傳遞指標給呼叫函式填充結構空間。用於儲存當前連線的一些關鍵資訊。
#define __sockaddr_common(sa_prefix) \
sa_family_t sa_prefix##family
struct in_addr
;//ipv4套接字位址結構,在使用結構之前必須置0
struct sockaddr_in
;/*通用套接字位址,傳遞給socket,listen等等的引數型別。
正常為了處理任何型別,應該是void *指標,但是socket在通用指標定義出現之前,所以採用了sockaddr的方向,去讀取第乙個成員區分型別。所以將sockaddr_in和sockaddr_in6位址傳入都必須進行強制轉換為struct sockaddr *型別。
*/struct sockaddr
;//ipv6套接字位址結構,用的較少,了解即可。
struct sockaddr_in6
; //上述位址結構僅僅為了記錄當前連線的埠以及ip位址資訊,供程序呼叫。
資料結構裡面包含其長度,當程序傳遞資料都核心時候,傳遞資料結構指標,因為裡面含有長度,所以核心填充結構不至於記憶體越界這就是值傳遞。當核心傳遞資料到程序,返回長度資訊,核心可以告訴程序核心究竟儲存了多少資訊。上述過程稱為值-結果引數。
大端模式,小端模式,系統硬體不同儲存資料位元組序列不同。
網路協議因為一次性傳遞一系列位元組,所以規範指定乙個網路位元組序,網路協議使用大端位元組序來傳送多位元組資料,也就是先傳送高位元組。只要接收方和傳送方都使用網路位元組序傳遞,資料就不會錯。
/*
h = host 主機位元組序(大端或小段)
n = network 網路位元組序(大端)
s = short
l = long
這些函式遮蔽了系統直接的差異,假如主機位元組序本來就是大端模式,那麼這些函式都是空定義。
*/uint32_t ntohl (uint32_t __netlong);
uint16_t ntohs (uint16_t __netshort);//返回主機位元組序
uint32_t htonl (uint32_t __hostlong);
uint16_t htons (uint16_t __hostshort);//返回網路位元組序
//將對應位元組對應長度全部清0
void __bzero (void *__s, size_t __n);//將目標位元組串指定數目置0,用於初始化套接字位址 類似memset。
void bcopy (const
void *__src, void *__dest, size_t __n);
int bcmp (const
void *__s1, const
void *__s2, size_t __n);
///僅僅適用於ipv4的位址轉換函式///
/*將cp中形如"206.168.112.68"類似的點分十進位制ip位址字串轉換成32位網路位元組序二進位制數。儲存在__inp中,成功返回1,失敗0.
*/int inet_aton (const
char *__cp, struct in_addr *__inp);
/*將32位網路位元組序二進位制轉換成點分十進位制。
因為返回乙個位址,所以,函式內部必須使用static才可以儲存返回值,否則函式退出即銷毀。
返回值指向的字串駐留在靜態記憶體中。所以該函式不可重入。
引數是結構,全部複製進棧,開銷非常大,為什麼這樣麼?這就需要問當初寫源**的人了。
*/char *inet_ntoa (struct in_addr __in);
///適用於ipv4和ipv6的位址轉換函式///
/*p=presentation表達,位址表達為字串。
n=numeric 數值為二進位制值。
位址二者相互轉換函式,支援ipv4和ipv6.
__af:指定協議型別
af_inet 用於ipv4協議
af_inet6 用於ipv6協議
__buf:存放轉換結果的地方
__len:指定目標單元大小,防止溢位呼叫者緩衝區。
*/int inet_pton (int __af, const
char *__restrict __cp, void *__restrict __buf);
const
char *inet_ntop (int __af, const
void *__restrict __cp,char *__restrict __buf, socklen_t __len);
套接字程式設計簡介
這是unp的第三章,主要講了一些基礎的struct以及一些基礎的api,這些struct在後面會一直使用的。ipv4與ipv6的結構儘管不一樣,但類似,連起名都只是ipv6的比ipv4的多來個6,如 struct in6 addr與struct in addr,struct sockaddr in6...
套接字程式設計簡介
以sockaddr in命名,定義在中。typedef uint32 t in addr t struct in addr struct sockaddr in 當作為乙個引數傳遞進任何套接字函式時,套接字位址結構總是以引用形式 也就是指向該結構的指標 傳遞。然而以這樣的指標為引數之一的任何套接字函...
套接字程式設計簡介
struct in addr posix規範只需要這個結構中的3個字段 sin family,sin addr,sin port struct sockaddr in 從核心到程序 為了使套接字函式能夠處理來自所支援的任何協議族的套接字位址結構,在標頭檔案中定義了乙個通用的套接字位址結構,並將指向某...