① Socket協議和Socket文件有什麼關系在linux中文件屬性為S
socket文件指的是UNIX域套接字,主要用於進程間通訊,不能用於兩台不同的主機間。它通過套接字文件建立連接,連接建立後的通訊與一般的套接字通訊一樣。
② linux 進程通信方式 pipe無名管道 fifo有名管道 共享內存映射 socket 消息隊列
在Linux系統中,進程間的通信(IPC, Inter-Process Communication)主要通過四種機制實現:管道(pipe)、有名管道(fifo)、共享內存映射以及Unix域socket。這些方法各自適用於不同的場景,讓進程能夠有效地交換數據。
1. 管道(pipe):無名管道,由`pipe()`函數創建,適合於有血緣關系的進程間通信,如父子進程。它在內核中創建一個緩沖區,通過`filedes`參數傳遞給用戶進程,用於單向通信,數據寫滿後會阻塞。
2. 有名管道(fifo):解決無血緣關系進程間的通信,使用`mkfifo`創建,相當於磁碟上的一個文件,通過文件名訪問。它實質上是基於管道的,只是給管道起了個名字,讀寫需要進程都打開文件。
3. 共享內存映射(mmap):通過`mmap`函數將磁碟文件的一部分映射到內存,支持同步修改(share映射)和獨立修改(private映射)。這常用於進程間的數據傳遞,特別是許可權受限的情況下。
4. Unix域socket(socket):利用網路通信技術,適用於遠程進程間的通信,常用於伺服器-客戶端模型,數據按照協議解析。
消息隊列,雖然視頻中未提及,但它是另一種間接通信方式,類似於郵箱系統,接收方根據消息類型從中間體獲取信息。消息隊列提供了一種獨立於進程運行狀態的通信方式,寫入者無需關心接收者是否在讀取。
每種方法都有其優缺點,選擇哪種取決於具體的應用場景和性能需求。理解這些通信方式有助於編寫高效、可靠的多進程應用程序。
③ Linux 進程間套接字通信(Socket)基礎知識
姓名:羅學元 學號:21181214375 學院:廣州研究院
【嵌牛導讀】Linux進程間套接字通信基礎
【嵌牛鼻子】Linux 進程間套接字及通信介紹
【嵌牛提問】Linux進程間套接字包含哪些內容,如何實現通信
一、套接字(Socket)通信原理
套接字通信允許互聯的位於不同計算機上的進程之間實現通信功能。
二、套接字的屬性
套接字的特性由3個屬性確定,它們分別是:域、類型和協議。
1. 套接字的域
它指定套接字通信中使用的網路介質,最常見的套接字域是AF_INET,它指的是Internet網路。當客戶使用套接字進行跨網路的連接時,它就需要用到伺服器計算機的IP地址和埠來指定一台聯網機器上的某個特定服務,所以在使用socket作為通信的終點,伺服器應用程序必須在開始通信之前綁定一個埠,伺服器在指定的埠等待客戶的連接。
另一個域AF_UNIX表示UNIX文件系統,就是文件輸入/輸出,它的地址就是文件名。
2. 套接字類型
網際網路提供了兩種通信機制:流(stream)和數據報(datagram),因而套接字的類型也就分為流套接字和數據報套接字。我們主要看流套接字。
流套接字由類型SOCK_STREAM指定,它們是在AF_INET域中通過TCP/IP連接實現,同時也是AF_UNIX中常用的套接字類型。
流套接字提供的是一個有序、可靠、雙向位元組流的連接,因此發送的數據可以確保不會丟失、重復或亂序到達,而且它還有一定的出錯後重新發送的機制。
與流套接字相對的是由類型SOCK_DGRAM指定的數據報套接字,它不需要建立連接和維持一個連接,它們在AF_INET中通常是通過UDP/IP實現的。它對可以發送的數據的長度有限制,數據報作為一個單獨的網路消息被傳輸,它可能丟失、復制或錯亂到達,UDP不是一個可靠的協議,但是它的速度比較高,因為它並不需要總是要建立和維持一個連接。
3.套接字協議
只要底層的傳輸機制允許不止一個協議來提供要求的套接字類型,我們就可以為套接字選擇一個特定的協議。通常只需要使用默認值。
三、套接字地址
每個套接字都有其自己的地址格式,對於AF_UNIX域套接字來說,它的地址由結構sockaddr_un來描述,該結構定義在頭文件
struct sockaddr_un{
sa_family_t sun_family; //AF_UNIX,它是一個短整型
char sum_path[]; //路徑名
};
對於AF_INET域套接字來說,它的地址結構由sockaddr_in來描述,它至少包括以下幾個成員:
struct sockaddr_in{
short int sin_family; //AN_INET
unsigned short int sin_port; //埠號
struct in_addr sin_addr; //IP地址
}
而in_addr被定義為:
struct in_addr{
unsigned long int s_addr;
}
四、基於流套接字的客戶/伺服器的工作流程
使用socket進行進程通信的進程採用的客戶/伺服器系統是如何工作的呢?
1.伺服器端
首先,伺服器應用程序用系統調用socket來創建一個套接字,它是系統分配給該伺服器進程的類似文件描述符的資源,它不能與其他的進程共享。
接下來,伺服器進程會給套接字起個名字,我們使用系統調用bind來給套接字命名。然後伺服器進程就開始等待客戶連接到這個套接字。
然後,系統調用listen來創建一個隊列,並將其用於存放來自客戶的進入連接。
最後,伺服器通過系統調用accept來接受客戶的連接。它會創建一個與原有的命名套接不同的新套接字,這個套接字只用於與這個特定客戶端進行通信,而命名套接字(即原先的套接字)則被保留下來繼續處理來自其他客戶的連接。
2.客戶端
基於socket的客戶端比伺服器端簡單。同樣,客戶應用程序首先調用socket來創建一個未命名的套接字,然後講伺服器的命名套接字作為一個地址來調用connect與伺服器建立連接。
一旦連接建立,我們就可以像使用底層的文件描述符那樣用套接字來實現雙向數據的通信。