併發伺服器之fork

2021-08-29 05:03:48 字數 2061 閱讀 2084

支援多個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...