Linux I O復用技術 poll

2021-09-22 22:29:28 字數 2180 閱讀 8596

1.介紹

poll函式的作用是檢測一組 socket 中某個或某幾個是否有「事件」就緒,即可讀可寫

在linux平台下的poll定義如下:

#include int poll(struct pollfd *fds, nfds_t nfds, int timeout);
引數:

struct pollfd ;
對於struct pollfd的結構體中的events(我們設定某個值所需要監聽的事件型別)revents(核心返回的事件型別)的值如下:值含義

pollin

資料可讀

pollpri

pollout

資料可寫

pollrdhup

pollerr

錯誤(only returned in revents)

pollhup

掛起(only returned in revents)

pollnval

fd沒有開啟(only returned in revents

pollrdnorm

同pollin

pollrdband

pollwrnorm

同pollout

pollwrband

2.**實戰

#include#include#include#include#include#include#include#include#includeint main(int argc, char* ar**)

struct sockaddr_in addr;

addr.sin_family = af_inet;

addr.sin_addr.s_addr = htonl(inaddr_any);

addr.sin_port = htons(8080);

int ret;

ret = bind(fd, (struct sockaddr*) &addr, sizeof(addr));

if(ret == -1)

ret = listen(fd, somaxconn);

if(ret == -1)

struct sockaddr_in clientaddr;

socklen_t clientaddrlen = sizeof(clientaddr);

std::vectorafds;

pollfd listen_fd;

listen_fd.fd = fd;

listen_fd.events = pollin;

listen_fd.revents = 0;

afds.push_back(listen_fd);

//開始用poll來管理多個連線

while(true)

else if(ret == 0)

else

printf("a client connected!,ip=%s,port=%d\n",inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));

pollfd tmp_fd;

tmp_fd.fd = afd;

tmp_fd.events = pollin;

tmp_fd.revents = 0;

afds.push_back(tmp_fd);//將客戶端連線的socket fd 加入到afds集合

}else;

int len = recv(afds[i].fd, buf, 256, 0);

if(len <= 0)

printf("afd[%d] recv %d bytes:%s\n", i, len, buf);}}

} }

} //關閉客戶端所以連線

for(int i = 0; i < afds.size(); ++i)

close(fd);//關閉監聽socket

}

Linux I O多路轉接poll技術

上篇部落格i o多路轉接select技術筆者已經為大家詳細介紹了select函式的使用方式以及特點。我們在文章最後總結的時候我們提到,select雖然已經很大程度上解決了i o過程中等待的問題,但是由於函式本身介面設計的不友好 能夠檢測的檔案描述符有上限,以及函式多次迴圈遍歷的效率問題導致selec...

Linux I O復用技術 epoll

1.介紹 epoll和之前介紹的select poll有很大的差異,幾乎現在所有的高併發i o模型都使用epoll 如nginx include int epoll create int size int epoll ctl int epfd,int op,int fd,struct epoll e...

Linux I O多路轉接poll

不同與select使用三個點陣圖來表示三個fdset的方式,poll使用 乙個 pollfd的指標實現。poll函式和select函式的任務相似 等待一組檔案描述符來準備執行i 0。引數 1 第乙個引數 fds struct pollfd 2 第二個引數 nfds nfds用來表示要監視檔案描述符的...