多路轉接伺服器之select

2021-08-04 18:29:56 字數 1684 閱讀 8827

多路轉接是5種i/o模型中的一種,i/o分為兩步,第一步等i/o事件就緒,第二步對資料進行i/o,提高i/o效率實質上是要減少等的時間的比重。i/o模型分為5種:

前四種是同步i/o,即自己等自己進行資料搬遷。後一種是非同步i/o,即自己發起讓底層去做,做好了通知我。 

阻塞/非阻塞,都是同步i/o,前者是死等,後者是只要i/o條件不成熟就返回。

select_server

#include

#include

#include

#include

#include

#include

#include

#include

#include

static

void

usage

(char* proc)

intstartup

(const

char *ip, int port)

struct sockaddr_in local;

local.sin_family = af_inet;

local.sin_port = htons(port);

local.sin_addr.s_addr = inet_addr(ip);

if(bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0)

if(listen(sock, 10) < 0)

return sock;

}int fds[1024];//定義全域性陣列用來存放就緒的檔案描述符

intmain

(int argc, char *argv)

int listen_sock = startup(argv[1], atoi(argv[2]));

fd_set rfds;//建立乙個檔案描述符集

int nums = sizeof(fds)/sizeof(fds[0]);

int i = 0;

for(; i < 1024; i++)

fds[0] = listen_sock;// 將監聽套接字放在0號下標處

while(1);

fd_zero(&rfds);// 清空檔案描述符集

for(i=0; i < nums; i++)

fd_set(fds[i], &rfds);// 把這個fd[i]放進fd集中

if(maxfd < fds[i])

}switch(select(maxfd+1, &rfds, null, null, null))

int j = 0;

for(; j < nums; j++)

}if(j == nums)else

}else

if(i != 0 && fd_isset(fds[i]\

, &rfds))else

if(s == 0)else

}else}}

break;};}

return0;}

測試結果:

可以一次被多個client連線,相比較多程序多執行緒select_server伺服器當使用者量較大時效能更好,而且它所佔的資源是較少的。但是呢它還是有很多的缺點滴

6 12多路IO轉接伺服器之select

title date comments categories br 多路i o轉接伺服器之select 2020 3 18 true linux linux 伺服器 6.12 多路i o轉接伺服器也叫多工io伺服器或者i o多路復用技術。該類伺服器實現的主旨思想是,不再由應用程式自己監聽客戶端的連線...

網路程式設計 多路I O轉接伺服器之select

思路 利用select 函式監聽資訊,accept 函式非阻塞的建立連線。相關api include according to earlier standards include include include intselect int nfds,fd set readfds,fd set wri...

多路IO轉接伺服器實現方法一 select 函式

採用多程序與多執行緒的方法來實現併發伺服器時,監聽的工作由server應用程式自身通過accept函式不斷去監聽。當客戶端連線較多時,這種方法會大大降低程式執行效率,消耗cpu資源 cpu需要在不同進 執行緒中切換執行 多程序與多執行緒實現併發伺服器方法可以參考以下兩篇文章 因為以上兩種方法的侷限性...