2014-01-09 40 views
14

,而我在讀什麼AF_INET手段,我瞭解到,有一個名爲UNIX domain socket另一個家庭。這裏是我讀到的wiki link例子來解釋Unix域套接字 - AF_INET VS AF_UNIX

我不明白這是什麼意思:

的Unix域套接字使用的文件系統作爲他們的地址名稱空間。 它們被進程引用爲文件系統中的inode。這個 允許兩個進程打開相同的套接字進行通信。然而,通信完全在內核的操作系統 內發生。

如果我想要做SSH or FTP,我使用哪個家庭AF_INET or AF_UNIX。其實我在這裏有點困惑。

回答

30

如果你想與遠程主機進行通信,那麼你可能會需要一個INET插座。

區別在於INET套接字綁定到IP地址端口元組,而UNIX套接字被「綁定」到文件系統上的特殊文件。通常,只有在同一臺機器上運行的進程才能通過後者進行通信。

那麼,爲什麼會一個使用UNIX插座?正是出於上述原因:同一主機上的進程之間的通信,作爲通過回送的INET套接字的輕量級替代方案。

實際上,INET套接字位於完整TCP/IP堆棧的頂部,具有流量擁塞算法,回退等處理。 A UNIX套接字不必處理任何這些問題,因爲一切都設計爲本地機器,所以它的代碼更簡單,通信更快。當然,你可能會注意到僅在重負荷下的差異,例如,反向時進行代理後面的Nginx等的應用服務器(Node.js的,旋風式...)

+0

這可能是一個愚蠢的例子:你能給出一個例子,說明同一主機上進程之間的通信發生嗎? – eagertoLearn

+2

在編程中讓進程與數據交換彼此,尤其是同一個應用程序的多個實例,或一組相關的應用程序一起工作。使用套接字進行交換隻是衆多不同之一可用於進程間通信的進程機制。 –

+1

不幸的是,沒有一個簡單的例子,因爲涉及進程間通信的體系結構通常不是微不足道的。我唯一想到的就是Chrome瀏覽器:您可能知道它通過將每個選項卡作爲不同的進程以及其他一些控制/渲染進程來管理沙盒。儘管如此,您仍然可以將Chrome用作單個應用程序,因爲這些進程可以相互通信。在Linux上,通過'UNIX'套接字進行通信。 –

0

AF_UNUX套接字提供偉大的進程間通信。打開一個套接字對socketpair(..)「並綁定到一個臨時文件名,寫入其中一個到達另一個,內核路由消息,沒有協議或文件系統開銷,可以使用阻塞I/O或選擇(.. 。)以FIFO的方式同步線程和進程我喜歡非阻塞select和datagram(可以獲得長度)模式,但你可以選擇你自己的模式,一定要在退出時刪除臨時文件(它將有零字節但仍然會出現在文件系統目錄中) jlp