日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux网络编程---I/O复用模型之poll

發(fā)布時間:2023/11/30 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux网络编程---I/O复用模型之poll 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

https://blog.csdn.net/men_wen/article/details/53456474

Linux網(wǎng)絡(luò)編程—I/O復(fù)用模型之poll

1.函數(shù)poll

poll系統(tǒng)調(diào)用和select類似,也是在指定時間內(nèi)輪詢一定數(shù)量的文件描述符,以測試其中是否有就緒者。

#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout); //返回值:若成功,返回就緒的描述符個數(shù),若超時則為0,若出錯則為-1
  • fds是指向一個pollfd結(jié)構(gòu)第一個元素的指針。每一個元素都是pollfd結(jié)構(gòu)類型,用于測試某個給定描述符fd的條件
struct pollfd {int fd; /* file descriptor */short events; /* requested events */short revents; /* returned events */ };

要測試的條件在events中指定,函數(shù)相應(yīng)的revents成員返回該描述符的狀態(tài),一個為調(diào)用值,一個為返回結(jié)果,這與select的傳入傳出參數(shù)不同。?
events和revents可以設(shè)置以下常量的一個或多個的按位或結(jié)果:

POLLIN //普通或帶外優(yōu)先數(shù)據(jù)可讀,即POLLRDNORM | POLLRDBAND POLLRDNORM //數(shù)據(jù)可讀 POLLRDBAND //優(yōu)先級帶數(shù)據(jù)可讀 POLLPRI //高優(yōu)先級可讀數(shù)據(jù) POLLOUT //普通或帶外數(shù)據(jù)可寫 POLLWRNORM //數(shù)據(jù)可寫 POLLWRBAND //優(yōu)先級帶數(shù)據(jù)可寫 //下面三個revents不包含 POLLERR //發(fā)生錯誤 POLLHUP //發(fā)生掛起 POLLNVAL //描述字不是一個打開的文件
  • out指定poll函數(shù)返回前等待多長時間,它是一個指定應(yīng)等待毫秒數(shù)的正值。

|timeout值|說明|?
|:-:|:-:|?
|-1|永遠等待|?
|0|立即返回,不阻塞進程|?
|>0|等待指定數(shù)目的毫秒數(shù)|

  • nfds 是監(jiān)控數(shù)組中有多少文件描述符需要被監(jiān)控

如果我們不關(guān)心某個特定的描述符,那么可以把與它對應(yīng)的pollfd結(jié)構(gòu)的fd成員設(shè)置為一個負值。poll函數(shù)會忽略這樣的pollfd結(jié)構(gòu)的events成員,返回時將其revents成員的值置為0。

select模型最多可以創(chuàng)建一個1024個文件描述符大小的集合,這是因為受到fd_set的固定數(shù)據(jù)類型的限制,而poll則沒有這樣的問題,因為分配一個pollfd結(jié)構(gòu)的數(shù)組并把數(shù)組中的元素通知內(nèi)核稱為調(diào)用者的責(zé)任。但是poll模型任然使用的是輪詢模型,效率比較低下。

2. poll模型實現(xiàn)

2.1 服務(wù)器端

#include "wrap.h" #include <poll.h> #include <limits.h> #include <sys/stropts.h>#define MAXLINE 1024 #define INFTIM -1 #define OPEN_MAX 3000 int main(int argc, char *argv[]) {int i, maxi, listenfd, connfd, sockfd;int nready;ssize_t n;char buf[MAXLINE];socklen_t clilen;struct pollfd client[OPEN_MAX];struct sockaddr_in clientaddr;listenfd = start_ser(argv[1], argv[2]);//監(jiān)聽文件描述符 該函數(shù)參考selectclient[0].fd = listenfd;//將監(jiān)聽文件描述符加入pollfd數(shù)組中client[0].events = POLLIN;//設(shè)置為輸入可讀for(i = 1; i < OPEN_MAX; i++){//初始化結(jié)構(gòu)體數(shù)組client[i].fd = -1;}maxi = 0;while(1){nready = poll(client, maxi+1, INFTIM); //阻塞等待注冊時間發(fā)生if(client[0].revents & POLLIN){//當(dāng)監(jiān)聽文件描述符響應(yīng)有新連接請求clilen = sizeof(clientaddr);connfd = Accept(listenfd, (struct sockaddr *)&clientaddr, &clilen);//接受新客戶for(i = 1; i < OPEN_MAX; i++){if(client[i].fd < 0){client[i].fd = connfd; //把新客戶的文件描述符加入數(shù)組break;}}if(i == OPEN_MAX){ //連接新客戶上限Close(connfd);perr_exit("too many clients");}client[i].events = POLLIN; //新客戶端的處理事件if(i > maxi){maxi = i; //更新最大值}if(--nready == 0){ //沒有可讀的描述符跳過本次循環(huán)continue;}}for(i = 1; i <= maxi; i++){ //請求所有客戶端的數(shù)據(jù)if((sockfd = client[i].fd) < 0){continue;}if(client[i].revents & POLLIN){ //POLLIN事件發(fā)生memset(buf, '\0', MAXLINE);if((n = Read(sockfd, buf, MAXLINE-1)) < 0){if(errno == ECONNRESET){ //當(dāng)客戶端發(fā)送resetClose(sockfd);client[i].fd = -1;}else{perr_exit("read err");}}else if(n == 0){Close(sockfd);client[i].fd = -1;}else{printf("client : %s\n", buf);}if(--nready == 0){ //沒有可讀的描述符跳過本次循環(huán)break;}}}}Close(connfd);Close(listenfd);return 0; }

2.2客戶端

#include "wrap.h"int main(int argc, char *argv[]) {struct sockaddr_in serveraddr;int connfd;connfd = Socket(AF_INET, SOCK_STREAM, 0);bzero(&serveraddr, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(atoi(argv[2]));inet_pton(AF_INET, argv[1], &serveraddr.sin_addr);Connect(connfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));char buf[1024];while((fgets(buf, 1024, stdin)) != NULL){Write(connfd, buf, strlen(buf));}Close(connfd);return 0; }

2.3程序測試結(jié)果


創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的Linux网络编程---I/O复用模型之poll的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品国产乱子伦一区二区 | 精品一区二区免费看 | 亚洲资源网站 | 大乳丰满人妻中文字幕日本 | 麻豆性生活 | 又紧又大又爽精品一区二区 | 在线视频中文字幕 | 黄色av观看 | av网在线| 久久乐国产精品 | 国产资源免费 | 国产最新地址 | 超碰在线公开免费 | 日本在线免费观看 | 麻豆app在线观看 | 国产老熟女伦老熟妇露脸 | av在线影音 | 波多野结衣电影在线播放 | 久热免费视频 | 黄色网免费 | 国产精品搬运 | 日韩成人高清视频在线观看 | 91喷水视频 | 午夜肉体高潮免费毛片 | 亚洲一区免费 | 双性懵懂美人被强制调教 | 亚洲AV无码成人国产精品色 | 国产aⅴ一区二区三区 | 老司机午夜福利视频 | 黄色av影视 | 激情av综合 | 丁香激情网 | 亚洲精品视频久久久 | 亚洲视频色 | 无遮挡裸光屁屁打屁股男男 | 色四月 | 最新中文字幕一区 | 91香蕉视频污污 | www.蜜臀av.com| 天堂成人在线 | 欧美激情爱爱 | 91麻豆国产视频 | 免费三片60分钟 | 91九色成人 | 美女黄页在线观看 | 国模杨依粉嫩蝴蝶150p | 人妻 丝袜美腿 中文字幕 | 精品美女在线观看 | 国产亚洲欧美在线视频 | 婷婷综合社区 | 三级在线网站 | 天天干 夜夜操 | 成人免费在线视频观看 | 亚洲草逼视频 | 一级特黄录像免费看 | 在线欧美视频 | 69色| 九九九九久久久久 | 午夜不卡影院 | 午夜伦理视频 | 一区二区三区国产av | 黄色在线一区 | 欧美性插视频 | 日韩午夜在线播放 | 日日夜操| 亚洲国产精 | 国产一二三在线 | 成人综合一区二区 | 色哟哟在线观看视频 | 色优久久 | 欧美日韩一区二区在线观看视频 | 精品久久久久久久中文字幕 | 69色综合 | 成人在线播放av | 神马久久久久久久久久 | 日本一本在线视频 | 综合狠狠| 少妇一级淫免费播放 | 国产精品v日韩精品v在线观看 | 手机看片日韩欧美 | 男人干女人视频 | 欧美理论在线观看 | 美脚の诱脚舐め脚视频播放 | 精品国产18久久久久久 | 亚洲精品乱码久久久久99 | 91国自产精品中文字幕亚洲 | 日韩中文字幕免费在线观看 | 日日夜夜撸撸 | 天天射日日射 | 亚洲欧美另类在线视频 | 国产精品久久国产精麻豆96堂 | 午夜免费看 | 国产婷婷色一区二区在线观看 | 国产在线看黄 | 久久综合婷婷国产二区高清 | 国产免费一区二区三区最新不卡 | 国产女人高潮的av毛片 | 午夜国产一级 | 男人疯狂高潮呻吟视频 |