支援多個client與server連線並recv和write
每來乙個新的client,server都fork乙個子程序為client服務(子程序用於與client通訊:recv/write)
父程序的while(1)迴圈中,一直呼叫accept接收新的連線
當accept接收成功後,返回新的套接字newconn,然後fork子程序與newconn通訊
/*server02*/
#include
/* see notes */
#include
#include
#include
/* superset of previous */
#include
#include
#include
#include
#include
#define max_client 10
#define max_read 1024
intmain()
;char read_buf[max_read]=;
int optvar;
pid_t pid;
socklen_t addr_len;
int i =0;
ssize_t ret ;
serv_fd =
socket
(af_inet,sock_stream,0)
;if(-
1== serv_fd)if(
setsockopt
(serv_fd, sol_socket,so_reuseaddr,
&optvar,
sizeof
(optvar))==
-1)bzero
(&serv_addr,
sizeof
(serv_addr));
serv_addr.sin_family = af_inet;
serv_addr.sin_port =
htons
(8001);
serv_addr.sin_addr.s_addr =
htons
(inaddr_any);if
(bind
(serv_fd,
(struct sockaddr *
)&serv_addr,
sizeof
(serv_addr))==
-1)/*一旦呼叫listen函式--套接字就會變成被動套接字--用來監聽客戶端,讓客戶端連線他
被動套接字--只能接受連線,不能主動傳送連線
做了兩個佇列:
乙個已經完成三次握手,建立連線的佇列--客戶端發connect請求被響應,已經成功完成連線
乙個是未完成成三次握手的佇列--正在握手
*/if(
listen
(serv_fd,max_client)==-
1)addr_len =
sizeof
(clt_addr)
;printf
("accepting connections ...\n");
while(1
) pid =
fork()
;//建立子程序,每乙個子程序處理乙個客戶端的連線
if(pid ==0)
//子程序業務邏輯
else
if(ret <0)
fputs
(read_buf,
stdout);
//列印內容
for(i =
0; i < ret ;i++
)//變成大寫字母
write
(con_fd,read_buf,ret)
;//回發報文
memset
(read_buf,0,
sizeof
(read_buf));
}}else
if(pid ==-1
)//建立子程序出錯
else
if(pid >0)
}return0;
}
fork併發伺服器
併發伺服器需要使用fork進行實現,其是unix中派生新程序的唯一方法。fork函式定義 include pid t fork void 呼叫fork一次,返回兩次 通過返回值告知程序本身當前是子程序還是父程序。併發伺服器 併發伺服器使用fork子程序來服務每個客戶。典型使用 listenfd so...
併發伺服器
併發伺服器 伺服器使用多個控制線程,同時處理多個客戶請求。有關併發執行的細節取決於所用作業系統。但其思路很簡單 併發伺服器程式被分為主程式 執行緒 和控制代碼兩部分,主程式只接受來自客戶的連線請求,並為該客戶建立乙個控制線程 每乙個控制線程只與乙個客戶互動,並執行控制代碼程式。當處理完乙個客戶後,該...
併發伺服器
1.select優點 跨平台缺點 對於單個程序的檔案描述符的數量存在最大限制linux一般為1024,32位機器位1024,64位機器位2048 2 對socket進行掃瞄時是一次掃瞄的,即採用輪詢的方法,效率較低 3.遍歷列表浪費cpu時間 poll優點 解決了套接字的上限問題 缺點 效率跟sel...