基於 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模組化結構 模組類別劃分 核心模組 包含兩類功能 主體功能 程序管理,許可權控制,錯誤日誌記錄,配置解析等。用於響應請求事件必須的功能 事件驅動機制,正規表示式解析等。編譯 快...