I O多路轉接之poll伺服器

2021-08-03 06:02:29 字數 4128 閱讀 2569

函式說明:

#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常...