併發伺服器 select 程式設計

2021-09-20 07:06:19 字數 2703 閱讀 2158

1,併發伺服器,通過多路io復用,能使得乙個程序同時處理多路io,提公升伺服器吞吐量。 在linux支援epoll模型之前,都使用select/poll模型來實現io多路復用。 

select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect、 accept、recv或recvfrom這樣的阻塞程式(所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發 生,如果事件沒有發生,程序或執行緒就被阻塞,函式不能立即返回)。 

可是使用select就可以完成非阻塞(所謂非阻塞方式non-block,就是程序或執行緒執行此函式時不必非要等待事件的發生,一旦執行肯定返回,以返 回值的不同來反映函式的執**況,如果事件發生則與阻塞方式相同,若事件沒有發生則返回乙個**來告知事件未發生,而程序或執行緒繼續執行,所以效率較高) 方式工作的程式,它能夠監視我們需要監視的檔案描述符的變化情況–讀寫或是異常。

#include #include #include int select(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, struct timeval *timeout);

void fd_clr(int fd, fd_set *set);

int fd_isset(int fd, fd_set *set);

void fd_set(int fd, fd_set *set);

void fd_zero(fd_set *set);

#include int pselect(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, const struct timespec *timeout,

const sigset_t *sigmask);

select 返回值

負值:select錯誤 

正值:某些檔案可讀寫或出錯 

0:等待超時,沒有可讀寫或錯誤的檔案 

服務端**:

#include #include #include #include #include #include #include #include #include #define port  12345

typedef struct client_st client;

char *s = "10.9.0.152";

int main(int argc, char *ar**)

printf("listenfd = %d\n",listenfd);

memset(&seraddr,0,sizeof(struct sockaddr_in));

seraddr.sin_family = af_inet;

seraddr.sin_port = htons(port);

seraddr.sin_addr.s_addr = inet_addr(s);

if(bind(listenfd,(struct sockaddr *)&seraddr,ser_len) == -1)

if(listen(listenfd, 5) == -1)

char buff[1024]; //資料接收緩衝區

fd_set allset; //套接字操作符

fd_set fdsr;

fd_zero(&allset);

fd_set(listenfd,&allset); //將監聽套接字加入輪詢

maxfd = listenfd;

maxi = -1;

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

while(1)

printf("select() break and the return num is %d. \n", ret);

if(fd_isset(listenfd,&fdsr))

for(j = 0; j < 256; j++)

}fd_set(newfd,&allset); //將client的套接字加入輪詢

if(newfd > maxfd)

maxfd = newfd;

if(j > maxi)

maxi = j;

if (--ret <= 0)

continue; //如果沒有新客戶端連線,繼續迴圈

} for(i = 0; i

else

printf("recv buff is %s\n",buff); //列印

if (--ret <= 0)

break; //如果沒有新客戶端有資料,跳出for迴圈回到while迴圈

} } }

close(newfd);

close(listenfd);

return 0;

}

客戶端:可以使用windows 網路助手

Select實現併發伺服器

併發伺服器除了可以用多執行緒和多程序實現以外,還可以用select實現單執行緒併發,下面用select實現簡單的示例,伺服器接收客戶端的連線,並將客戶發的訊息返回,如下 伺服器端 main.c include include include include include include inclu...

單執行緒併發伺服器 select

伺服器 include creatsocket.h include include include include include include include include include include include error.h define buffsize 20 extern in...

UDP併發伺服器模型 二 select機制

上篇文章說了下 udp 併發模型。然後筆者也自己編寫了一套 基本上能顯示 udp 併發機制。大致原理參考 select機制能很好地提供多路io功能。對於本套 已基本上能提供類似 select 的功能主要函式介面 void listen head init struct list head head ...