伺服器模型

2021-07-24 18:32:16 字數 2550 閱讀 5042

伺服器模型

1-- 迴圈伺服器模型

tcp 迴圈伺服器

udp 迴圈伺服器

2-- 併發伺服器

tcp 併發伺服器

父子程序實現併發伺服器:

父親程序 ,接收請求。accept

兒子程序 ,處理具體客戶端需求。send / recv

注意點:殭屍程序,父親活著,兒子死亡,父親沒有為兒子程序收屍,會產生殭屍程序。

避免殭屍程序:

1、兒子活著,父親死亡。

2、父親**兒子程序的屍體

wait/waitpid()

3、兒子死亡,父親也死亡。系統**殭屍程序

訊號:signal();

**資源,應該在訊號處理函式中進行。

select 實現併發伺服器:

監聽 sockfd 、acceptfd

ggvc 全部複製

網路屬性

int getsockopt(int sockfd, int level, int optname,

void *optval, socklen_t *optlen);

功能:獲取網路套接字的屬性資訊

引數:sockfd   網路套接字

level    sol_socket  應用層

ipproto_tcp  傳輸層

ipproto_ip   ip選項. 

optname   so_broadcast  廣播

so_reuseaddr  允許重複繫結

so_sndbuf     獲取傳送快取區大小的命令

so_rcvbuf     接收快取區大小的命令

so_rcvtimeo   超時檢測 

optval    操作的值     

optlen    值的大小

返回值:成功 0

出錯 -1

int setsockopt(int sockfd, int level, int optname,

const void *optval, socklen_t optlen);

功能:設定網路套接字的屬性資訊

引數:sockfd   網路套接字

level    sol_socket  應用層

ipproto_tcp  傳輸層

ipproto_ip   ip選項. 

optname   so_broadcast  廣播

so_reuseaddr  允許重複繫結

so_sndbuf     獲取傳送快取區大小的命令

so_rcvbuf     接收快取區大小的命令

so_rcvtimeo   超時檢測 

optval    操作的值     

optlen    值的大小

返回值:成功 0

出錯 -1

網路超時檢測

在網路通訊中,很多操作會使得程序阻塞

tcp套接字中的recv/accept/connect

udp套接字中的recvfrom

超時檢測的必要性

避免程序在沒有資料時無限制地阻塞

當設定的時間到時,程序從原操作返回繼續執行

1-- 使用setsockopt 設定超時時間。

struct timeval tv;

52     tv.tv_sec = 5;

53     tv.tv_usec = 0;

54 55     if(setsockopt(sockfd, sol_socket, so_rcvtimeo, &tv, sizeof(tv)) < 0)

56    

2-- 使用select 實現 超時檢測

struct timeval ;

struct timeval  tv;

tv.tv_sec = 5;

tv.tv_usec = 10;

if((ret = select(maxfd+1, &readfds, null, null, &tv)) < 0)

注意點:每次select 之前,都需要對時間重新賦值

3-- 使用 alarm 定時器,實現超時檢測

int sigaction(int signum, const struct sigaction *act,

struct sigaction *oldact);

功能:實現訊號的註冊和訊號屬性的修改

引數:signum  訊號

act     訊號的新屬性

oldact  訊號的舊屬性

返回值:成功 0

出錯 -1

struct sigaction ;

struct sigaction act;

sigaction(sigalrm, null, &act);

act.sa_handler = handler;

act.sa_flags &= ~sa_restart;  // 將訊號的自重啟屬性設為假

sigaction(sigalrm, &act, null);

自重啟屬性:當乙個訊號產生時,程序會去執行訊號處理函式,訊號處理函式執行完畢,程序會接著

原來的點,繼續向下執行。(這叫做自重啟屬性為真)

伺服器模型

在使用socket進行網路程式設計時,首先要選擇乙個合適的伺服器模型是很重要的。在網路程式裡,通常都是乙個伺服器服務多個客戶機,為了處理多個客戶機的請求,伺服器端的程式有不同的處理方式。迭代模型算是最早期的伺服器模型,其核心實現是每來乙個使用者,然後為這個使用者服務到底,過程中不接受任何新的使用者請...

TCP伺服器模型

迴圈伺服器 迴圈伺服器在同乙個時刻只可以響應乙個客戶端的請求 併發伺服器 併發伺服器在同乙個時刻可以響應多個客戶端的請求 9.1 迴圈伺服器 udp伺服器 udp迴圈伺服器的實現非常簡單 udp伺服器每次從套接字上讀取乙個客戶端的請求,處理,然後將結果返回給客戶機.可以用下面的演算法來實現.sock...

伺服器程式設計模型

從執行緒的角度,可以將伺服器程式設計分為兩類 單執行緒和多執行緒。單執行緒模型 乙個程序中只有乙個執行緒,由於只有乙個執行緒,所以要實現高效能,必須與 non blocking i o i o multiplexing 相結合,另外 libevent 本身也是單執行緒的。相對於多執行緒,單執行緒 s...