socket套接字地址介紹?
掃描二維碼
隨時隨地手機看文章
前言
socket套接字也叫伯克利套接字,是加州大學伯克利分校的研究人員在 20 世紀 80 年代早期提出的。BSD作為unix系統(tǒng)的一大分支,最早在BSD 4.2 Unix 內(nèi)核上實現(xiàn)了 socket。因為它符合unix系統(tǒng)一切皆文件的哲學理念,方便易用,于是很快就推廣開來使用了。
目前,Linux系統(tǒng)和window系統(tǒng)都已經(jīng)成熟支持socket套接字。
套接字地址格式
通用套接字地址格式
struct sockaddr{ sa_family_t sa_family; /* 地址族. 16-bit*/ char sa_data[14]; /* 具體的地址值 112-bit */ };
IPv4 套接字格式地址
struct sockaddr_in { sa_family_t sin_family; /* 地址族. 16-bit*/ in_port_t sin_port; /* 端口口 16-bit*/ struct in_addr sin_addr; /* 這里僅僅用作占位符,不做實際用處 */ unsigned char sin_zero[8]; };
IPv6 套接字地址格式
struct sockaddr_in6 { sa_family_t sin6_family; /* 地址族. 16-bit*/ in_port_t sin6_port; /* 傳輸端口號 # 16-bit */ uint32_t sin6_flowinfo; /* IPv6流控信息 32-bit*/ struct in6_addr sin6_addr; /* IPv6地址128-bit */ uint32_t sin6_scope_id; /* IPv6域ID 32-bit */ };
從上面我們可以看到,IPv4和IPv6的套接字地址格式是不一樣的,因此我們?nèi)绻胍獙烧哌M行抽象統(tǒng)一,就必須要構(gòu)造一個通用套接字地址格式。有了統(tǒng)一可以操作的地址結(jié)構(gòu),那么就可以設計一套統(tǒng)一的接口。結(jié)合強制類型轉(zhuǎn)換,也能預防內(nèi)存泄露。
對于地址族,有非常多類型,這里只列舉常見的幾種:
-
AF_LOCAL:表示本地通信,很多人對網(wǎng)絡通信存在誤解,以為socket接口只能用在不同主機間通信,實際上它也可以用于本機進程間通信的。很多情況下,也可以寫成AF_UNIX、AF_FILE
-
AF_INET:因特網(wǎng)使用的IPv4地址
-
AF_INET6:因特網(wǎng)使用的IPv6地址
注意:有時候AF_XXX也會被寫成PF_XXX,這兩個實際是同一個宏。
sin_port表示端口號,用來區(qū)分主機中進程 sin_addr表示ip地址,用來表示本機在網(wǎng)絡中的編號
總結(jié)
文章重點介紹了不同類型套接字地址之間的一些區(qū)別,并對它們存在的這些區(qū)別的原因進行了講解,再結(jié)合下面這一幅圖,就能很清晰地掌握不同類型的套接字地址了,如下圖:
