socket套接字地址介紹?
掃描二維碼
隨時(shí)隨地手機(jī)看文章
前言
socket套接字也叫伯克利套接字,是加州大學(xué)伯克利分校的研究人員在 20 世紀(jì) 80 年代早期提出的。BSD作為unix系統(tǒng)的一大分支,最早在BSD 4.2 Unix 內(nèi)核上實(shí)現(xiàn)了 socket。因?yàn)樗蟯nix系統(tǒng)一切皆文件的哲學(xué)理念,方便易用,于是很快就推廣開(kāi)來(lái)使用了。
目前,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; /* 這里僅僅用作占位符,不做實(shí)際用處 */ unsigned char sin_zero[8]; };
IPv6 套接字地址格式
struct sockaddr_in6 { sa_family_t sin6_family; /* 地址族. 16-bit*/ in_port_t sin6_port; /* 傳輸端口號(hào) # 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)绻胍獙?duì)兩者進(jìn)行抽象統(tǒng)一,就必須要構(gòu)造一個(gè)通用套接字地址格式。有了統(tǒng)一可以操作的地址結(jié)構(gòu),那么就可以設(shè)計(jì)一套統(tǒng)一的接口。結(jié)合強(qiáng)制類(lèi)型轉(zhuǎn)換,也能預(yù)防內(nèi)存泄露。
對(duì)于地址族,有非常多類(lèi)型,這里只列舉常見(jiàn)的幾種:
-
AF_LOCAL:表示本地通信,很多人對(duì)網(wǎng)絡(luò)通信存在誤解,以為socket接口只能用在不同主機(jī)間通信,實(shí)際上它也可以用于本機(jī)進(jìn)程間通信的。很多情況下,也可以寫(xiě)成AF_UNIX、AF_FILE
-
AF_INET:因特網(wǎng)使用的IPv4地址
-
AF_INET6:因特網(wǎng)使用的IPv6地址
注意:有時(shí)候AF_XXX也會(huì)被寫(xiě)成PF_XXX,這兩個(gè)實(shí)際是同一個(gè)宏。
sin_port表示端口號(hào),用來(lái)區(qū)分主機(jī)中進(jìn)程 sin_addr表示ip地址,用來(lái)表示本機(jī)在網(wǎng)絡(luò)中的編號(hào)
總結(jié)
文章重點(diǎn)介紹了不同類(lèi)型套接字地址之間的一些區(qū)別,并對(duì)它們存在的這些區(qū)別的原因進(jìn)行了講解,再結(jié)合下面這一幅圖,就能很清晰地掌握不同類(lèi)型的套接字地址了,如下圖:
