Linux網絡通信中的poll函數應用

poll函數

  poll函數起源於SVR3,最初侷限於流設備。SVR4取消了這種限制,允許poll工作在任何描述字上。poll提供的功能與select類似,不過在處理流設備時,它能夠提供額外的信息。

  1.#include <poll.h>

  2.

  3.int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);

  4.               返回:就緒描述字的個數,0-超時,-1-出錯

  第一個參數是指向一個結構數組第一個元素的指針。每個數組元素都是一個pollfd結構,用於指定測試某個給定描述字fd的條件。

  struct pollfd{

  int fd;              //descriptor to check

  short events;    //events of interest on fd

  short revents;   //events that occurred on fd

  };

  要測試的條件由events成員指定,而返回的結果則在revents中存儲。常用條件及含意說明如下:

poll函數可用的測試值

常量 說明
POLLIN 普通或優先級帶數據可讀
POLLRDNORM 普通數據可讀
POLLRDBAND 優先級帶數據可讀
POLLPRI 高優先級數據可讀
POLLOUT 普通數據可寫
POLLWRNORM 普通數據可寫
POLLWRBAND 優先級帶數據可寫
POLLERR 發生錯誤
POLLHUP 發生掛起
POLLNVAL 描述字不是一個打開的文件

 

  注意:後三個只能作爲描述字的返回結果存儲在revents中,而不能作爲測試條件用於events中。

  第二個參數nfds是用來指定數組fdarray的長度。

  最後一個參數timeout是指定poll函數返回前等待多長時間。它的取值如下:

 

timeout值 說明
INFTIM 永遠等待
0 立即返回,不阻塞進程
>0 等待指定數目的毫秒數

 實例代碼:

pollfd pfd;
pfd.fd = m_iSock;
pfd.events = POLLIN;
while (m_isInited)
{
if(poll(&pfd, 1, 100) > 0)
{
struct sockaddr_in addrClient;
socklen_t addrLen;
memset(m_szBuf,0,sizeof(m_szBuf));
ssize_t nMsgLen = recvfrom(m_iSock,m_szBuf,sizeof(m_szBuf),0,(struct sockaddr*)&addrClient,&addrLen);
if(nMsgLen > 0)
{
m_pReceiveFunction(this,m_szBuf,nMsgLen);
}
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章