poll模型和select模型很相似。兩者間的主要區別在於我們要如何指定待檢查的檔案描述符。在select中,我們提供三個集合,在每個集合中標明我們感興趣的檔案描述符。而在poll中我們提供一列檔案描述符,並在每個檔案描述符上標明我們感興趣的事件,完整**戳這裡,用到的系統呼叫如下
#include int poll(struct pollfd *fds, nfds_t nfds, int timeout);
struct pollfd ;
pollin普通或帶外優先資料可讀,即pollrdnorm | pollrdband
pollrdnorm-資料可讀
pollrdband-優先順序帶資料可讀
pollpri 高優先順序可讀資料
pollout普通或帶外資料可寫
pollwrnorm-資料可寫
pollwrband-優先順序帶資料可寫
pollerr 發生錯誤
pollhup 發生掛起
pollnval 描述字不是乙個開啟的檔案
nfds 監控陣列中有多少檔案描述符需要被監控
timeout 毫秒級等待
-1:阻塞等,#define inftim -1 linux中沒有定義此巨集
0:立即返回,不阻塞程序
>0:等待指定毫秒數,如當前系統時間精度不夠毫秒,向上取值
如果不再監控某個檔案描述符時,可以把pollfd中,fd設定為-1,poll不再監控此
pollfd,下次返回時,把revents設定為0。
下面是poll模型的服務端**
#include #include #include #include #include #include #include /* see notes */
#include #include #include /* superset of previous */
#include #include #include "public_head.h"
#include "fileio.h"
#define listen_backlog 50
#define max_client 1024
static ssize_t handle_request(int acceptfd)
; char write_buff[256] = ;
memset(read_buff, 0, sizeof(read_buff));
readret = read(acceptfd, read_buff, sizeof(read_buff));
if (readret == 0)
return readret;
printf("acceptfd:%d, recv message:%s\n", acceptfd, read_buff);
memset(write_buff, 0, sizeof(write_buff));
sprintf(write_buff, "this is server send message");
write(acceptfd, write_buff, sizeof(write_buff));
printf("\n");
return readret;
}int main(int argc, char ** argv)
; int ready;
int clientlen = 0;
struct pollfd clientfd[max_client];
for (i = 0; i < max_client; ++i)
clientfd[i].fd = -1;
memset(&server_addr, 0, sizeof(server_addr));
memset(&client_addr, 0, sizeof(client_addr));
if((sockfd = socket(af_inet, sock_stream, 0)) < 0)
handle_error("socket");
server_addr.sin_family = af_inet;
server_addr.sin_port = htons(9527);
server_addr.sin_addr.s_addr = htonl(inaddr_any);
if(bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
;close(sockfd);
strerror_r(errno, buff, sizeof(buff));
handle_error("bind");
}if(listen(sockfd, listen_backlog) < 0)
clientfd[0].fd = sockfd;
clientfd[0].events = pollrdnorm;
clientlen++;
while(1)
else if (ready == 0)
if (clientfd[0].revents & pollrdnorm)
memset(client_ip, 0, sizeof(client_ip));
inet_ntop(af_inet, &client_addr.sin_addr, client_ip, sizeof(client_ip));
printf("client:%s:%d\n", client_ip, ntohs(client_addr.sin_port));
clientfd[clientlen].fd = acceptfd;
clientfd[clientlen].events = pollrdnorm;
clientlen++;
if (ready == 1)
continue;
}
for (i = 1; i < clientlen; ++i)
}} }
close(sockfd);
exit(exit_success);
}
高併發伺服器學習筆記之四 多執行緒模型
該模型和多程序模型的思想類似,只是把程序換成了執行緒,因為執行緒的建立比程序建立開銷小。但這並不是說多執行緒就一定比多程序優秀,程序和執行緒都有各自的優缺點,具體請自行查閱執行緒和程序相關的內容,完整 戳這裡 include include include include include inclu...
PHP寫的非同步高併發伺服器,基於libevent
部落格分類 php fpsocket linuxqq 本文章於2013年11月修改。swoole提供了php的高效能server,非同步io,asyncmysql等特性。原php 框架遷移至保留原有 和web框架。swoole socket網路開發框架,是基於php的libevent和pcntl模組...
PHP寫的非同步高併發伺服器,基於libevent
部落格分類 php fpsocket linuxqq 本文章於2013年11月修改。swoole提供了php的高效能server,非同步io,asyncmysql等特性。原php 框架遷移至保留原有 和web框架。swoole socket網路開發框架,是基於php的libevent和pcntl模組...