UNIX網路程式設計 併發伺服器(多程序)

2021-07-14 09:13:27 字數 2737 閱讀 7545

以下程式的源**均是unix網路程式設計上的例子程式。

intro/daytimetcpsrv1.c

#include	"unp.h"

#include #include "apueerror.h"

int main(int argc, char **argv)

}

tcp一般採用併發伺服器。當服務乙個客戶請求可能花費較長時間時,我們並不希望整個伺服器被單個客戶長時間占用,而是希望同時服務多個客戶。

unix中編寫併發伺服器最簡單的方法就是fork乙個子程序來服務每個客戶。併發伺服器中主伺服器迴圈通過派生乙個子程序來處理每個新的連線。

併發伺服器程式的框架:

int main(int argc, char **argv)

close(connfd);

}}

說明:

(1)以下是對上述併發伺服器程式的框架的圖示說明,可以讓你對**框架和接下來的說明有乙個直觀的認知:

a. socket返回後,監聽套接字listenfd引用計數+1。伺服器阻塞於accept呼叫,客戶連線請求到達:

b. accept返回(已連線套接字connfd引用計數+1),連線被伺服器核心接收,新的套接字connfd被建立(每fork乙個服務客戶的子程序就會建立乙個connfd),由此已連線套接字跨連線讀寫資料:

c. 伺服器呼叫fork:(注意:此時listenfd, connfd這兩個描述符均在父程序與子程序之間共享(也就是被複製)

d. 接著,父程序關閉已連線套接字(父程序的),子程序關閉監聽套接字(子程序的)。父程序需要用監聽套接字去等待新客戶的連線。子程序使用它自己的已連線套接字提供服務,處理與客戶的連線:

(2)accept,乙個連線建立,伺服器呼叫fork建立子程序。接著子程序通過已連線套接字connfd服務客戶,父程序則等待另外乙個客戶的連線(還是原來的監聽套接字)。

(3)既然客戶由子程序提供服務,那麼父程序就關閉已連線的套接字。

(4)在主迴圈中,先呼叫accept,再呼叫fork。所接受的已連線套接字隨後在父程序與子程序之間共享。通常,子程序接著讀寫這個已連線的套接字,而父程序則關閉這個已連線的套接字。

(5)為什麼父程序對connfd呼叫close沒有終止伺服器(子程序)與客戶的連線?

因為每個套接字都有乙個引用計數,它是當前開啟著的套接字的描述符的個數。在上述框架程式中,

(6)如果父程序對每個由accept返回的已連線套接字都不掉用close,那麼併發伺服器將會發生什麼?

首先,父程序將最終耗盡可用描述符(任何程序在任何時刻擁有的開啟著的描述符是通常有限制的)。其次,最重要的是,沒有任何乙個客戶連線會被終止(任何乙個子程序會呼叫close關閉已連線的套接字connfd,引用計數減1,但是保持為1——父程序中的connfd始終沒有關閉,這將妨礙tcp連線終止序列的發生,導致連線一直開啟著)。

通過以下示例說明埠號與併發伺服器

之間的關係,也展示了併發伺服器與客戶互動的細節,希望能解開你的其他疑惑。

執行步驟:

(1)多宿主機,啟動服務,等待客戶的請求:

(2)第乙個客戶請求連線:

(3)伺服器接收第乙個客戶的連線,fork乙個自身的副本,該子程序處理第乙個客戶的請求。特別注意:已連線套接字使用與監聽套接字相同的本地埠(21)。而且,連線一旦建立,已連線套接字的本地位址隨即(12.106.32.254)寫入。

(4)第二個客戶請求連線:

總結:綜上例子,tcp無法通過僅僅檢視目的埠號來分離外來請求的從而自動分節到不同節點,這是做不到的。它必須檢視套接字對的四個元素(本地ip位址、本地tcp埠號、外部ip位址、外部tcp埠號)才能確定由哪個端點接收某個到達的分節。如上圖,對於伺服器本地埠21存在3個套接字:(1)來自206.168.112.219埠1500的,目的地為12.106.32.254埠21的分節1,它被第乙個子程序;(2)來自206.168.112.219埠1501的,目的地為12.106.32.254埠21的分節1,它被第二個子程序;(3)所有目的埠為21的其他tcp分節都被遞送到擁有監聽套接字的伺服器父程序。

linux網路程式設計多程序併發伺服器

伺服器端 include include include include include include include include define port 1234 define maxsize 1024 static int clientprocess int connfd,struct s...

UNIX網路程式設計 伺服器高效併發模式

半同步 半非同步模式 在併發模式下,同步和非同步的概念與i o同步非同步的概念有所不同,這裡的同步是指程式按照 的順序執行,而非同步指的是程式的執行需要系統事件來驅動,比如訊號 中斷等。非同步執行緒效率高,但編寫相對複雜,難於調式,而同步執行緒剛好相反,邏輯簡單,但效率較差。半同步 半非同步模式結合...

Unix系統程式設計 4 多程序併發伺服器

伺服器按照處理方式來看可以分為 迭代伺服器只能一次處理乙個客戶的請求。也就是說在伺服器響應乙個客戶請求時,如果有另乙個客戶發起請求是不能得到及時響應的。下圖是乙個典型的迭代伺服器處理流程。併發伺服器則能同時處理多個客戶端請求。下圖是乙個基於多程序模型的併發伺服器處理流程。原始碼可以到 github連...