poll機制與select機制類似,通過管理檔案描述符來進行輪詢,效率更高,並且處理的連線個數不受核心的限制。
# include int poll ( struct pollfd * fdarray, unsigned int nfds, int timeout);
引數:
(1)fdarray:可讀套接字,是乙個指向陣列的指標,這個陣列是由 struct pollfd 作為元素構成的,pollfd結構體:
struct pollfd ;
(2)nfds:所監控的最大檔案描述符的個數,使用的時候傳入當前最大的檔案描述符號+1 即可 。
(3)timeout:工作模式:
阻塞模式:
將 timeout = inftim傳入即可,當**執行poll 函式的所在行的時候,若是fdarray 陣列中的所有套接字描述符上面都沒有發生變化,則**不會向下執行,而是卡在 poll 所在行,直到 fdarray 中的套接字描述符有發生變化poll 方法才會返回發生變化的全部套接字的個數,並繼續向下執行;若出錯則返回-1 。
非阻塞模式:
將 timeout = 0傳入即可,當**執行到 poll 函式所在行的時候,若是 fdarray 陣列中的所有套接字均沒有變化,則不作停留,立即返回0; 若是 fdarray陣列中存在套接字發生變化的,則立即返回發生變化的套接字的總數;若是 poll內部出錯,立即返回 -1 。
固定時間內阻塞模式:
將 timeout 設定為非零的整數,當代名執行到 poll 函式所在行的時候,會等待 timeout 秒,在時間到達的時候,返回在這一段時間內發生變化的套接字總個數(沒有就返回 0);若是在 timeout(sec) 這段時間內有錯誤發生的話,立即返回 -1 。
(4)返回值:
例:服務端
server.h
#pragma once
#include #include #include #include #include #include #include #include #include #include #include #include "error.h"
using namespace std;
#define backlog 5
class server
;
server.cpp
#include "server.h"
server::server(int iport) : port(iport), listenfd(-1), clientfd(-1)
int listen_val = listen(listenfd, backlog); // 監聽套接字
if (listen_val < 0)
}server::~server()
cout << "close server" << endl;
}void server::initreadfds()
readfds[listenfd].fd = listenfd;
readfds[listenfd].events = pollin;
}int server::getmaxfd()
} return maxfd;
}void server::addclient(int c)
void server::removeclient(int c)
void server::pollrun()
clientaddrlen = sizeof(struct sockaddr_in);
clientfd = accept(readfds[i].fd, (struct sockaddr*)&clientaddr, &clientaddrlen);
if (-1 == clientfd)
else if (0 == clientfd)
else
else if (0 == recv_val)
else
continue;
}} }
}
注意:recv()的第乙個引數應該為客戶端的控制代碼clientfd。
main.cpp
#include #include "server.h"
using namespace std;
int main()
catch (const char* e)
delete s;
return 0;
}
客戶端:
client.h
#pragma once
#include #include #include #include #include #include #include #include #include #include #define max_size 100
using namespace std;
class client
;
client.cpp
#include "client.h"
client::client(int iport) : port(iport), serverfd(-1)
serveraddr.sin_family = af_inet;
serveraddr.sin_port = htons(port);
// inet_pton(af_inet, "10.206.142.12", &serveraddr.sin_addr.s_addr);
inet_pton(af_inet, "0.0.0.0", &serveraddr.sin_addr.s_addr);
int ret;
ret = connect(serverfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
if (ret < 0)
}client::~client()
}void client::run()
else
sleep(3);
} }
main.cpp
#include #include "client.h"
using namespace std;
int main()
catch (const char* e)
return 0;
}
網路程式設計 poll
寫下來,怕忘記了 server include include include include include include include include gettimeofday include struct in addr include inet aton include getpid i...
網路程式設計 21 poll
三 測試 理解 poll 函式 int poll struct ploofd fds,unsigned long nfds,int timeout 引數 返回值 struct pollfd struct pollfdpollserver.c include common.h intmain int ...
Linux網路程式設計 poll函式
作用 監視並等待多個檔案描述符的屬性變化。函式原型 int poll struct pollfd fds,nfds t nfds,int timeout 函式引數意義 fds 指向乙個結構體陣列的第0個元素的指標,每個陣列元素都是乙個struct pollfd結構,用於指定測試某個給定的fd的條件。...