高併發伺服器學習筆記之七 非同步IO poll模型

2021-08-20 21:50:03 字數 3051 閱讀 8346

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模組...