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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AF_UNIX和AF_INET

發布時間:2024/4/14 编程问答 74 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AF_UNIX和AF_INET 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

family參數代表地址家族,比較常用的為AF_INET或AF_UNIX。AF_UNIX用于同一臺機器上的進程間通信,AF_INET對于IPV4協議的TCP和UDP 。

type參數代表套接字類型,SOCK_STREAM(流套接字)或者SOCK_DGRAM(數據報文套接字)。

其中AF_INET類型有關的例子非常多,但AF_UNIX的少見,所以給出一個AF_UNIX簡單的例子,并通過select實現非阻塞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通信過程

典型的TCP/IP四層模型的通信過程。

?

發送方、接收方依賴IP:Port來標識,即將本地的socket綁定到對應的IP端口上,發送數據時,指定對方的IP端口,經過Internet,可以根據此IP端口最終找到接收方;接收數據時,可以從數據包中獲取到發送方的IP端口。

發送方通過系統調用send()將原始數據發送到操作系統內核緩沖區中。內核緩沖區從上到下依次經過TCP層、IP層、鏈路層的編碼,分別添加對應的頭部信息,經過網卡將一個數據包發送到網絡中。經過網絡路由到接收方的網卡。網卡通過系統中斷將數據包通知到接收方的操作系統,再沿著發送方編碼的反方向進行解碼,即依次經過鏈路層、IP層、TCP層去除頭部、檢查校驗等,最終將原始數據上報到接收方進程。

2.??AF_UNIX域socket通信過程?

典型的本地IPC,類似于管道,依賴路徑名標識發送方和接收方。即發送數據時,指定接收方綁定的路徑名,操作系統根據該路徑名可以直接找到對應的接收方,并將原始數據直接拷貝到接收方的內核緩沖區中,并上報給接收方進程進行處理。同樣的接收方可以從收到的數據包中獲取到發送方的路徑名,并通過此路徑名向其發送數據。

?

3.??相同點

操作系統提供的接口socket(),bind(),connect(),accept(),send(),recv(),以及用來對其進行多路復用事件檢測的select(),poll(),epoll()都是完全相同的。收發數據的過程中,上層應用感知不到底層的差別。

4.??不同點

1 建立socket傳遞的地址域,及bind()的地址結構稍有區別:

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

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

2 AF_INET需經過多個協議層的編解碼,消耗系統cpu,并且數據傳輸需要經過網卡,受到網卡帶寬的限制。AF_UNIX數據到達內核緩沖區后,由內核根據指定路徑名找到接收方socket對應的內核緩沖區,直接將數據拷貝過去,不經過協議層編解碼,節省系統cpu,并且不經過網卡,因此不受網卡帶寬的限制。

3 AF_UNIX的傳輸速率遠遠大于AF_INET

3 AF_INET不僅可以用作本機的跨進程通信,同樣的可以用于不同機器之間的通信,其就是為了在不同機器之間進行網絡互聯傳遞數據而生。而AF_UNIX則只能用于本機內進程之間的通信。?

5.??使用場景

AF_UNIX由于其對系統cpu的較少消耗,不受限于網卡帶寬,及高效的傳遞速率,本機通信則首選AF_UNIX域。不用多說,AF_INET則用于跨機器之間的通信。

轉載于:https://www.cnblogs.com/shangerzhong/p/9153737.html

總結

以上是生活随笔為你收集整理的AF_UNIX和AF_INET的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。