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用來表示要監視檔案描述符的...