日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

AF_UNIX和AF_INET

發(fā)布時(shí)間:2024/4/14 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AF_UNIX和AF_INET 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

family參數(shù)代表地址家族,比較常用的為AF_INET或AF_UNIX。AF_UNIX用于同一臺(tái)機(jī)器上的進(jìn)程間通信,AF_INET對(duì)于IPV4協(xié)議的TCP和UDP 。

type參數(shù)代表套接字類型,SOCK_STREAM(流套接字)或者SOCK_DGRAM(數(shù)據(jù)報(bào)文套接字)。

其中AF_INET類型有關(guān)的例子非常多,但AF_UNIX的少見,所以給出一個(gè)AF_UNIX簡(jiǎn)單的例子,并通過(guò)select實(shí)現(xiàn)非阻塞socket。

Server端:

<pre class="python" name="code">import os import socket import select import sys sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) path = './tt.d' if os.path.exists(path): os.unlink(path) sock.bind(path) sock.listen(5) infds, outfds, errfds = select.select([sock,],[],[],5) if len(infds) != 0: con,addr = sock.accept() print con.recv(1024) con.close() sock.close() print '5 seconds later no data coming' Server

?

Client端:

</pre><pre class="python" name="code">import socket sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.connect('./tt.d') sock.send('Hello Socket') sock.close() Client

?

?

1.??AF_INET域socket通信過(guò)程

典型的TCP/IP四層模型的通信過(guò)程。

?

發(fā)送方、接收方依賴IP:Port來(lái)標(biāo)識(shí),即將本地的socket綁定到對(duì)應(yīng)的IP端口上,發(fā)送數(shù)據(jù)時(shí),指定對(duì)方的IP端口,經(jīng)過(guò)Internet,可以根據(jù)此IP端口最終找到接收方;接收數(shù)據(jù)時(shí),可以從數(shù)據(jù)包中獲取到發(fā)送方的IP端口。

發(fā)送方通過(guò)系統(tǒng)調(diào)用send()將原始數(shù)據(jù)發(fā)送到操作系統(tǒng)內(nèi)核緩沖區(qū)中。內(nèi)核緩沖區(qū)從上到下依次經(jīng)過(guò)TCP層、IP層、鏈路層的編碼,分別添加對(duì)應(yīng)的頭部信息,經(jīng)過(guò)網(wǎng)卡將一個(gè)數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)中。經(jīng)過(guò)網(wǎng)絡(luò)路由到接收方的網(wǎng)卡。網(wǎng)卡通過(guò)系統(tǒng)中斷將數(shù)據(jù)包通知到接收方的操作系統(tǒng),再沿著發(fā)送方編碼的反方向進(jìn)行解碼,即依次經(jīng)過(guò)鏈路層、IP層、TCP層去除頭部、檢查校驗(yàn)等,最終將原始數(shù)據(jù)上報(bào)到接收方進(jìn)程。

2.??AF_UNIX域socket通信過(guò)程?

典型的本地IPC,類似于管道,依賴路徑名標(biāo)識(shí)發(fā)送方和接收方。即發(fā)送數(shù)據(jù)時(shí),指定接收方綁定的路徑名,操作系統(tǒng)根據(jù)該路徑名可以直接找到對(duì)應(yīng)的接收方,并將原始數(shù)據(jù)直接拷貝到接收方的內(nèi)核緩沖區(qū)中,并上報(bào)給接收方進(jìn)程進(jìn)行處理。同樣的接收方可以從收到的數(shù)據(jù)包中獲取到發(fā)送方的路徑名,并通過(guò)此路徑名向其發(fā)送數(shù)據(jù)。

?

3.??相同點(diǎn)

操作系統(tǒng)提供的接口socket(),bind(),connect(),accept(),send(),recv(),以及用來(lái)對(duì)其進(jìn)行多路復(fù)用事件檢測(cè)的select(),poll(),epoll()都是完全相同的。收發(fā)數(shù)據(jù)的過(guò)程中,上層應(yīng)用感知不到底層的差別。

4.??不同點(diǎn)

1 建立socket傳遞的地址域,及bind()的地址結(jié)構(gòu)稍有區(qū)別:

  socket() 分別傳遞不同的域AF_INET和AF_UNIX

  bind()的地址結(jié)構(gòu)分別為sockaddr_in(制定IP端口)和sockaddr_un(指定路徑名)

2 AF_INET需經(jīng)過(guò)多個(gè)協(xié)議層的編解碼,消耗系統(tǒng)cpu,并且數(shù)據(jù)傳輸需要經(jīng)過(guò)網(wǎng)卡,受到網(wǎng)卡帶寬的限制。AF_UNIX數(shù)據(jù)到達(dá)內(nèi)核緩沖區(qū)后,由內(nèi)核根據(jù)指定路徑名找到接收方socket對(duì)應(yīng)的內(nèi)核緩沖區(qū),直接將數(shù)據(jù)拷貝過(guò)去,不經(jīng)過(guò)協(xié)議層編解碼,節(jié)省系統(tǒng)cpu,并且不經(jīng)過(guò)網(wǎng)卡,因此不受網(wǎng)卡帶寬的限制。

3 AF_UNIX的傳輸速率遠(yuǎn)遠(yuǎn)大于AF_INET

3 AF_INET不僅可以用作本機(jī)的跨進(jìn)程通信,同樣的可以用于不同機(jī)器之間的通信,其就是為了在不同機(jī)器之間進(jìn)行網(wǎng)絡(luò)互聯(lián)傳遞數(shù)據(jù)而生。而AF_UNIX則只能用于本機(jī)內(nèi)進(jìn)程之間的通信。?

5.??使用場(chǎng)景

AF_UNIX由于其對(duì)系統(tǒng)cpu的較少消耗,不受限于網(wǎng)卡帶寬,及高效的傳遞速率,本機(jī)通信則首選AF_UNIX域。不用多說(shuō),AF_INET則用于跨機(jī)器之間的通信。

轉(zhuǎn)載于:https://www.cnblogs.com/shangerzhong/p/9153737.html

總結(jié)

以上是生活随笔為你收集整理的AF_UNIX和AF_INET的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。