網路程序通訊

2021-06-25 13:28:52 字數 1808 閱讀 7498

上一次我學習了程序與執行緒,大略地知道了它們聯絡與區別,這次我學習了進一步學習了程序的相關知識:應用程序跨越網路的通訊。

1、什麼是系統呼叫?

在學習應用程序之間的網路通訊之前,我們應該首先了解什麼是系統呼叫。現在大多數的作業系統採用系統呼叫的機制在應用程式和作業系統之間轉化控制權。例如應用程式要對乙個檔案進行操作,它不能直接去找那個檔案然後操作。應用程式的程序首先要呼叫乙個請求函式(系統呼叫)請求對這個檔案的操作,作業系統程序得到此請求後會建立乙個檔案描述符(後面將詳述)給應用程式程序,應用程式程序再根據系統提供的檔案描述符去操作檔案。

系統呼叫和函式呼叫實際上是非常類似的。如果應用程序要從作業系統或得某項服務,應用程序就必須啟動系統呼叫(類似呼叫函式),對系統的的控制權(本質可能是程序下的執行緒對cpu的占用)就從應用程序傳遞給了系統呼叫介面(函式介面),此介面再把控制權轉交給作業系統,作業系統把這個呼叫轉交給其內部的某個過程,過程執行完畢(類似函式執行完畢)就把控制權轉交給應用程序。

2、應用程式設計介面

應用程式設計介面(api)系統呼叫介面的另一種稱呼。它定義了許多標準的應用介面函式**用程序呼叫,以獲得作業系統的服務。在網路程式設計中,應用程序與運輸層協議(如 tcp、udp、甚至sctp)的介面就是套接字,如下圖所示。

由於現在 tcp/ip 協議大多被嵌入到了作業系統中,因此上圖呼叫 tcp 協議是由作業系統控制的。

3、客戶程序、伺服器程序的通訊

客戶程序與伺服器程序的通訊可以簡單地描述如下圖:

以上是針對tcp連線的,由於udp是不是面向連線的,所以不會有listen 和 accept。伺服器程序雖然建立了套接字,但是其中的埠號和ip位址時空的,呼叫bind可以獲取埠號和ip位址。客戶端程序沒有呼叫套接字,埠號隨機分配。這其中最重要的就是accept的呼叫,當伺服器主程序呼叫accept後,將會發生以下步驟:

(過程也可以從上圖看出),這樣伺服器就能同時處理多個連線,併發工作。

4、套接字的建立和套接字描述符

linux中套接字型別有:

當應用程序要進行網路通訊時,它需要請求套接字soket系統呼叫,這樣作業系統會為它建立乙個套接字,並為這個應用程序分配一定的資源。那麼如何來標識這些資源呢?作業系統用到了套接字描述符來標識這些資源,並把這個引數傳遞給應用程序。下面就解釋一下套接字描述符到底十個什麼東西。

套接字描述符在linux中成為套接字描述符,在windows中通常被成為控制代碼,是乙個較小的整數。每乙個整數唯一對應乙個套接字描述符表,這些表儲存在固定的記憶體中,以方便應用程序通過引數(套接字描述符—較小的整數)找到對應的套接字描述符表項,再通過表項中的指標訪問套接字的內容,因為此指標指向存放套接字內容的位址。這樣套接字的建立就完成了。那麼建立的套接字裡面有什麼內容呢?

套接字的資料內容如下圖(以伺服器端為例):

這是伺服器主程序呼叫accept後建立的新的連線套接字的內容,紅色的部分表示套接字建立時未填寫的部分,本地埠和本地ip在應用程序呼叫bind後填寫。

可以思考:遠地埠和ip在在什麼時候填寫,客戶程序和伺服器程序填寫的時機是否相同?

網路程式設計中多程序通訊

include include include include include include include include include int main len sizeof cliaddr cliaddr.sin family af inet 通過ip位址和埠號可以確定乙個連線到一台主機的...

網路程式設計 程序間通訊(匿名管道)

匿名管道概述 匿名管道就是沒有名字的管道了,還有一種管道呢,叫做命名管道。在本地機器上可以使用匿名管道來實現父程序和子程序之間的通訊,這裡需要注意兩點,第一就是在本地機器上,這是因為匿名管道不支援跨網路之間的兩個程序之間的通訊,第二就是實現的是父程序和子程序之間的通訊,而不是任意的兩個程序。說了這麼...

程序通訊 程序管道

程序間通訊的幾種常用方式 管道 命名管道 訊號 訊號量 共享記憶體 訊息佇列 套接字。管道 pipe 一種半雙工的通訊方式,資料只能單向流動且只能在具有共同祖先的程序間使用。命名管道 name pipe 也是一種半雙工的通訊方式,但他允許不相關程序間的通訊。訊號 sinal 乙個程序通過訊號通知其他...