C 網路程式設計之poll

2021-10-02 03:02:34 字數 3386 閱讀 9654

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的條件。...