伺服器模型
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...