函式說明:
#include
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
引數說明:fds:是乙個struct pollfd結構型別的陣列,用於存放需要檢測其狀態的socket描述符;每當呼叫這個函式之後,系統不會清空這個陣列,操作起來比較方便;特別是對於socket連線比較多的情況下,在一定程度上可以提高處理的效率;這一點與select()函式不同,呼叫select()函式之後,select()函式會清空它所檢測的socket描述符集合,導致每次呼叫select()之前都必須把socket描述符重新加入到待檢測的集合中;因此,select()函式適合於只檢測乙個socket描述符的情況,而poll()函式適合於大量socket描述符的情況;nfds:nfds_t型別的引數,用於標記陣列fds中的結構體元素的總數量;
timeout:是poll函式呼叫阻塞的時間,單位:毫秒;
返回值:(1)大於0:陣列fds中準備好讀、寫或出錯狀態的那些socket描述符的總數量;
(2)等於0:陣列fds中沒有任何socket描述符準備好讀、寫,或出錯;此時poll超時,超時時間是timeout毫秒;換句話說,如果所檢測的socket描述符上沒有任何事件發生的話,那麼poll()函式會阻塞timeout所指定的毫秒時間長度之後返回,如果timeout==0,那麼poll() 函式立即返回而不阻塞,如果timeout==inftim,那麼poll() 函式會一直阻塞下去,直到所檢測的socket描述符上的感興趣的事件發生是才返回,如果感興趣的事件永遠不發生,那麼poll()就會永遠阻塞下去;
(3)等於-1: poll函式呼叫失敗,同時會自動設定全域性變數errno;
pollfd結構
struct pollfd ;
poll函式可用的測試值pollin 普通或優先順序帶資料可讀
pollrdnorm 普通資料可讀
pollrdband 優先順序帶資料可讀
pollpri 高優先順序資料可讀
pollout 普通資料可寫
pollwrnorm 普通資料可寫
pollwrband 優先順序帶資料可寫
pollerr 發生錯誤
pollhup 發生掛起
pollnval 描述字不是乙個開啟的檔案
poll伺服器的優點高效;檔案描述符的個數沒有上限,解決了select控制代碼有限的問題缺點:
包含大量檔案描述符的陣列被整體複製於使用者態和核心的位址空間之間,而不論這些檔案描述符是否就緒,它的開銷隨著檔案描述符數量的增加而線性增大。
//setver端**
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pollfd_size 1024
static
void usage(const
char* proc)
int startup(const
char* _ip, int _port)
int opt = 1;
setsockopt(sock, sol_socket, so_reuseaddr, &opt, sizeof(opt));
struct sockaddr_in local;
local.sin_family = af_inet;
local.sin_port = htons(_port);
local.sin_addr.s_addr = inet_addr(_ip);
if(bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0)
if(listen(sock, 10) < 0)
return sock;
}int main(int argc, char* argv)
int listen_sock = startup(argv[1], atoi(argv[2]));
struct pollfd pfd[pollfd_size];
pfd[0].fd = listen_sock;
pfd[0].events = pollin;
pfd[0].revents = 0;
int timeout = 5000;
int i = 1;
for(; i1;
}while(1)
printf("get a new client...[%s : %d]\n",\
inet_ntoa(client.sin_addr),ntohs(client.sin_port));
fflush(stdout);
int j = 1;
for(; j< pollfd_size; j++)
else
if(j == pollfd_size)}}
else
if(i != 0)//讀或寫事件就緒
else
if(s == 0)
else
}else
if(pfd[i].revents & pollout) //write
else
if(s == 0)
else
}else
if(s == 0)
else
}}//else if
}//for
}//default
}//switch
}//while
return
0;}
//client端**
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static
void usage(const
char* proc) //使用說明
//tcp_client server_ip server_port
int main(int argc, char* argv)
int sock = socket(af_inet, sock_stream , 0);
if(sock < 0)
struct sockaddr_in server;
server.sin_family = af_inet;
server.sin_port = htons(atoi(argv[2]));
server.sin_addr.s_addr = inet_addr(argv[1]);
if(connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0)
printf("connect success\n");
char buf[1024];
while(1)}}
close(sock);
return
0;}
執行結果:
**還存在一點問題,稍後改正!
linux 多路IO轉接伺服器之poll
引數1是結構體陣列的首位址。events的選取 pollin普通或帶外優先資料可讀,即pollrdnorm pollrdband pollrdnorm 資料可讀 pollrdband 優先順序帶資料可讀 pollpri 高優先順序可讀資料 pollout普通或帶外資料可寫 pollwrnorm 資料...
I O多路轉接之poll
poll 函式 這個函式是某些linux系統提供的用於執行與select 函式同等功能的函式,下面是這個函式的宣告 include int poll struct pollfd fds,nfds t nfds,int timeout 引數說明 fds 是乙個struct pollfd結構型別的陣列,...
IO多路轉接之poll
poll函式 include int poll struct pollfd fds,nfds t nfds,int timeout pollfd結構 struct pollfd fds poll函式監聽的結構列表 nfds fds陣列的長度。timeout 喚醒時間 pollfd結構體events常...