那麼如何把套接字和檔案聯絡起來呢? 答案就是通過下面這張圖。
其中task_struct表示乙個程序,files_struct中的fd_array表示該程序開啟的所有描述符,對於套接字來說,與其他型別檔案的區別就是最終f_op指向的是socket_file_ops。不過,可以看到,這裡的socket_file_ops只有一些通用的操作,並沒有send和recv。特有的操作通過socketcall()區分的。
終於到今天的主角了。實際上,對每乙個新建立的套接字,核心協議棧都會建立struct socket
和struct sock
兩個資料結構。這兩個結構就像孿生兄弟,struct socket
面向使用者空間,struct sock
面向核心空間。
struct socket
struct socket
簡化版的結構如下
其中task_struct表示乙個程序,files_struct中的fd_array表示該程序開啟的所有描述符,對於套接字來說,與其他型別檔案的區別就是最終f_op指向的是socket_file_ops。不過,可以看到,這裡的socket_file_ops只有一些通用的操作,並沒有send和recv。特有的操作通過socketcall()區分的。
終於到今天的主角了。實際上,對每乙個新建立的套接字,核心協議棧都會建立struct socket
和struct sock
兩個資料結構。這兩個結構就像孿生兄弟,struct socket
面向使用者空間,struct sock
面向核心空間。
struct socket
struct socket
簡化版的結構如下
struct socket ;
其中type
表示協議,這是在建立套接字的時候的protocol
引數確定的
int socket(int domain, int type, int protocol);
file
指標指向上面那張圖中的struct file
結構,通過它,socket
便與檔案系統關聯了起來。
sk
指向孿生的兄弟sock
結構。
socket
結構中最重要的要數ops
指標了,根據協議型別,它指向一種特定協議的實現。比如tcp的就是inet_stream_ops
,icmp、udp協議對應inet_dgram_ops
,rawip對應的是inet_sockraw_ops
同樣地,這些也都在建立套接字的時候就決定了。
struct proto_ops
的簡化版本的結構如下
inetsw
中註冊的每種協議都有ops
和prot
兩個字段,前者與struct socket
結構關聯到一起,後者與struct sock
關聯到一起。在inet_create
中,struct socket
的ops
欄位和struct sock
的sk_prot
欄位被賦值。
以我們建立的套接字型別是tcp為例,此時struct socket
和struct sock的關係如下
套接字 Socket 定義
套接字介面可分為三類 公認埠 註冊埠 動態和 或私有埠 套接字,簡單的說就是通訊的兩方的一種約定,用套接字中的相關函式來完成通訊過程 應用層通過傳輸層進行資料通訊時,tcp和udp會遇到同時為多個應用程式程序提供併發服務的問題。多個tcp連線或多個應用程式程序可能需要通過同乙個 tcp協議埠傳輸資料...
socket 套接字通訊
要通過internet進行通訊,至少需要一對套接字,其中乙個執行在客戶端,稱之為clientsocket,另乙個執行於伺服器端面,稱為serversocket。根據連線啟動的方式以及本地要連線的目標,套接字之間的連線過程可以分為三個步驟 伺服器監聽 客戶端請求 連線確認。伺服器監聽是指服務端套接字並...
套接字(socket) 埠
套接字 socket socket可以看成在兩個程式進行通訊連線中的乙個端點,乙個程式將一段資訊寫入socket中,該socket將這段資訊傳送給另外乙個socket中,使這段資訊能傳送到其他程式中。套接字,是支援tcp ip的網路通訊的基本操作單元,可以看做是不同主機之間的程序進行雙向通訊的端點,...