C 問題25 socket通訊流程

2021-10-24 23:03:21 字數 1418 閱讀 8042

網路中的程序是通過socket來通訊的。socket起源於 unix,而unix/linux基本哲學之一就是「一切皆檔案」,socket是「open—write/read—close」模式的一種實現,那麼socket就提供了這些操作對應的函式介面。

以使用tcp協議通訊的socket為例,其互動流程大概是:

(1)socket():函式就是生成乙個用於通訊的套接字檔案描述符,這個套接字描述符可以作為稍後bind()函式的繫結物件。

伺服器根據位址型別(ipv4,ipv6)、socket型別、協議建立socket。

(2)bind():服務程式通過分析配置檔案,從中解析出想要監聽的位址和埠,再加上可以通過socket()函式生成的套接字sockfd,就可以使用bind()函式將這個套接字繫結到要監聽的位址和埠組合"addr:port"上。繫結了埠的套接字可以作為listen()函式的監聽物件。

伺服器為socket繫結ip位址和埠號。

(3)listen():int listen(int sockfd, int backlog); 這是核心原始碼中listen函式的定義,sockfd 就是bind函式關聯後的套接字檔案描述符。

backlog:linux kernel2.2以前,backlog 用於設定上圖中未完成和已完成佇列的最大總長度(實際上是只有乙個佇列,但分為兩種狀態),實際目前這種是bsd衍生的一種套接字型別,它採用了乙個佇列,在這單個佇列中存放3次握手過程中的所有連線,但是佇列中的每個連線分為兩種狀態:syn-recv和established。linux kernel2.2開始,這個引數只表示已完成佇列(accept queue)的最大長度。(面試會被問到第二個引數的意義)

伺服器socket監聽埠號請求,隨時準備接收客戶端發來的連線,這時候伺服器的socket並沒有被開啟。

(4)socket():客戶端建立socket,生成檔案描述符。

(6)accept():伺服器socket接收到客戶端socket請求,被動開啟,開始接收客戶端請求,直到客戶端返回連線資訊。這時候socket進入阻塞狀態,所謂阻塞即accept()方法一直到客戶端返回連線資訊後才返回,開始接收下乙個客戶端連線請求。

客戶端連線成功,向伺服器傳送連線狀態資訊。

伺服器accept方法返回,連線成功。

(7)send():客戶端向socket寫入資訊。

(8)recv():伺服器讀取資訊。

(9)close():客戶端關閉。

(10)close():伺服器端關閉。

socket通訊流程

原文 對 tcp ip udp socket 程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission...

socket通訊流程

socket是 開啟 讀 寫 關閉 模式的實現,以使用tcp協議通訊的socket為例,其互動流程大概是這樣子的 伺服器根據位址型別 ipv4,ipv6 socket型別 協議建立socket 伺服器為socket繫結ip位址和埠號 伺服器socket監聽埠號請求,隨時準備接收客戶端發來的連線,這時...

Socket通訊流程

鏈結 socket簡介 兩個程序能夠進行通訊的辦法是在網路中唯一的標識乙個程序。而在網路中唯一的標識乙個程序的方法是 標出ip位址 協議 埠號。這樣就可以利用socket進行通訊了。什麼是socket?socket翻譯為套接字,socket是在應用層和傳輸層之間的乙個抽象層,它把tcp ip層複雜的...