客戶 伺服器模型(二) 模組化

2021-08-15 03:10:12 字數 2786 閱讀 4291

基於 socket 的客戶/伺服器系統大多是類似的。雖然電子郵件、檔案傳輸、遠端登入和分布式資料庫,以及其他的 internet 服務在螢幕上顯示的內容相異,但是它們的運作原理是一致的。一旦理解了乙個 socket 流的客戶/伺服器系統,就可以理解大多數其他的系統。

客戶連線到伺服器,然後傳送、接受或者交換資料,最後退出。該互動過程中主要包含了以下 3 個操作:

(1)伺服器設立服務。

(2) 客戶連線到伺服器。

(3) 伺服器和客戶處理事務。

建立連線

基於流的系統需要建立連線。

(1)建立伺服器端 socket

設立乙個服務一般需要如下3個步驟 :

a.建立乙個 socket

socket = socket(pf_ inet , sock_stream , 0);
b.給 socket 繫結 乙個 位址

bind(sock , ιaddr ,sizeof(addr));
c.監聽接入請求

listen(sock , queue_size)
模組化:

#include#include#include#include#include#include#define hostlen 256

#define backlog 1

int make_serv_socket_q(int portnum,int backlog);

int make_serv_socket(int portnum)

int make_serv_socket_q(int portnum,int backlog)

(2)建立到伺服器的連線

基於流的網路客戶連線到伺服器包含以下兩個步驟 :

a.建立乙個sock e t

socket = socket(pf_inet , sock_stream , 0 )
b.使用該 soc k et 連 接到伺服器

connect(sock , &serv_addr , sizeof(serv_addr))
模組化:

int connect_to_serv(char *host,int portnum)

(3)客戶/伺服器的會話

a.一般的客戶端

網路客戶通常呼叫伺服器來獲得服務

int fd;

fd = connect_to_server(host , port);

if(fd == 1)

exit(1) ;

talk_with_server(fd);//會話

close(fd) ;

b.一般的伺服器端

int sock , fd;

sock = make_serv_socket(port);

if(sock == -1)

exit (1);

while (1)

伺服器的設計問題: diy 或**

這裡使用了兩種伺服器的設計方法:

·自己做 (do it yourself .diy)–伺服器接收請求,自己處理工作。

.**–伺服器接收請求,然後建立乙個新程序來處理工作。

優缺點:

a.自己做用於快速簡單的任務,對於一些伺服器,效率最高的方法是服務

器自己來完成工作並且在 listen 中限制連線佇列的大小

b.**用於慢速的更加複雜的任務,伺服器處理耗時的任務或等待資源時,需要**來完成其工作,伺服器可以使用 fork 建立乙個新程序來處理每個請求。通過這種方式,伺服器可以同時處理多個任務。

c.使用 sigchld 來阻止殭屍 (zombie) 問題,除了等待於程序死亡外,父程序可以設定為接收表示子程序死亡的訊號,當子程序退出或被終止時,核心發sigchld 給父程序。但它不同於其他訊號,預設時 sigchld 是被忽略的。父程序可以為 sigchld 設定乙個訊號處理函式,它可以呼叫 wait 。

———>但是程式執行到訊號處理函式跳轉時會中斷系統呼叫 accept 。當 accept 被訊號中斷時,返回 -1. 然後設定 errno 到 eintr 。**中把 accept 返回的-1 作為錯誤,然後從主迴圈中跳出來。因此需要更改 maln 函式來區分真正的錯誤和被打斷的系統呼叫所產生的錯誤。

———->父程序在執行訊號處理函式時,其他子程序退出發出的訊號到達導致unix阻塞,但是並不快取訊號。從而,第二個訊號被阻塞,而第三個訊號丟失了。此時,如果還有其他的子程序退出,來自於這些子程序的訊號也將丟失。訊號處理函式只呼叫了 wait 一次,所以每次丟失乙個訊號意味著少呼叫了一次 walt ,這將產生更多的殭屍程序 (zombie) 。解決方法是在處理函式中呼叫 wait 足夠多的次數來去除所有的終止程序。

在wait中呼叫while(waitpid(1 , null , wnohang);

其第乙個引數表示它所要等待的程序 ld號 。 值-1 表示等待所有的子程序。第二個引數是指 向 整型值的指標,用來獲取狀態。伺服器並不關心子程序中發生了什麼,不過乙個健壯的伺服器可能用該資訊來跟蹤錯誤。waitpid 的最後乙個引數表示選項。wnohang引數告訴waitpid: 如果沒有殭屍程序,則不必等待。該迴圈直到所有退由的子程序都被等待了才停止 。即使多個子程序同時退出並產生了多個sigchld,所有的這些訊號都會被處理。

客戶 伺服器模型

在我們日常所見的網路應用程式中,很多都是由客戶 伺服器 c s 模型組成的。伺服器主要承擔著提供資源的責任,通常可以為數量較多的客戶提供服務。今天我們主要來通過乙個最基本的回射伺服器和客戶端模型的編寫,來體會到客戶和伺服器的角色定位,以及對套接字有更深的理解。首先要有一些準備知識,了解在linux下...

C S模型(客戶 伺服器模型)

c s模型即客戶 client 伺服器 server 模型。1.特點 伺服器提供服務,客戶請求服務。2.客戶端和伺服器之間連線的數量對應關係 多個客戶程序可以同時訪問乙個服務程序,乙個客戶程序可以同時訪問多個伺服器程序提供的服務。3.客戶端和伺服器所在不同網路位置所適用的場合 執行在同乙個機器上的場...

三 Nginx伺服器架構初探(3 1 模組化結構)

本章要點 模組化結構的相關知識。nginx如何處理web請求。nginx的事件驅動模型。nginx的設計架構概覽。nginx模組化結構 模組類別劃分 核心模組 包含兩類功能 主體功能 程序管理,許可權控制,錯誤日誌記錄,配置解析等。用於響應請求事件必須的功能 事件驅動機制,正規表示式解析等。編譯 快...