大多數套接字函式都需要乙個指向套接字位址結構的指標作為引數。每個協議簇抵都定義它自己的套接字位址結構
這些結構的名字均以sockaddr_開頭,並以對應每個協議簇的唯一字尾結尾
1.ipv4套接字位址結構
它以sockaddr_in命名
struct in_addr{
in_addr_t s_addr;//32位無符號整數型別
struct sockaddr_in{
unit8_t sin_len;//套接字位址結構長度 它是乙個無符號短整形 可以不設定它的值
sa_family_t sin_family;//套接字位址結構的位址簇 任何無符號整數型別
in_port_t sin_port;//tcp或udp埠號 網路位元組序 至少16位的無符號整數型別
struct in_addr sin_addr;//ipv4位址 網路位元組序
cahr sin_zero[8];//不是必須要 保持對齊
2.通用套接字位址結構
當作為乙個引數傳遞進任何套接字函式時,套接字位址結構總是以引用形式(也就是以指向該結構的指標)來傳遞
然而以這樣的指標作為引數之一的任何套接字函式必須處理來自所支援的任何協議簇的套接字位址結構
有了ansi c後解決辦法很簡單:void *是通用的指標型別
然而套接字函式在ansi c之前定義的 採取的方法是定義乙個通用套接字位址結構
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;//位址簇型別
char sa_data[14];//
於是套接字函式被定義為以指向某個通用套接字位址結構的乙個指標作為其引數之一
正如bind函式的原型
int bind(int ,struct sockaddr *, sockle _t);
這就要求對這些函式的任何呼叫都必須要將指向特定於協議的套接字位址結構的指標進行強制型別轉換
變成指向某個通用套接字位址結構的指標
struct sockaddr_in serv;
bind (sockfd,(struct sockaddr*) &serv,sizeof(serv));
如果我們省去了其中的型別強制轉換部分
並假設系統的標頭檔案中有 bind函式的乙個原型
那麼c編譯器就會產生這樣的警告:把不相容的指標類型別傳遞給bind函式
從核心角度來看:核心必須取呼叫者的指標,把它強制型別轉換為struct sockaddr * 型別,然後檢查其中sa_family欄位的值來確定這個結構的真實型別
Unix套接字位址結構
include ipv4套接字位址結構 struct in addr posix只關注sin family,sin port,sin addr,所有網路套接字地質結構都至少16位元組 struct sockaddr in include 通用套接字位址結構 struct sockaddr inclu...
通用套接字位址結構
1.通用套接字位址結構起因 當作為乙個引數傳遞進任何套接字函式時候,套接字位址結構總是以引用的形式來傳遞,並且,這樣有乙個引數的人核桃皆自函式必須處理例子所有支援的任何協議族的套接字位址結構。因此在標頭檔案中定義了乙個通用的套接字位址結構。2.通用套接字位址結構 include struct soc...
套接字位址族與sockaddr結構
位址族來自address family的翻譯,可以看成是套接字的型別,即不同的套接字對應不同的位址族。每種型別的套接字都擁有自己獨特的通訊定址方式。位址族的取值包括af inet af inet6以及af unspec等,這些值在winsock2.h中定義。sockaddr結構用於儲存套接字位址。在...