網路程式設計 多路I O轉接伺服器之select

2021-10-05 11:52:13 字數 2099 閱讀 4464

思路

利用select()函式監聽資訊,accept()函式非阻塞的建立連線。

相關api

#include

/* according to earlier standards */

#include

#include

#include

intselect

(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds,

struct timeval *timeout)

; nfds: 監控的檔案描述符集裡最大檔案描述符加1,因為此引數會告訴核心檢測前多少個檔案描述符的狀態

readfds: 監控有讀資料到達檔案描述符集合,傳入傳出引數

writefds: 監控寫資料到達檔案描述符集合,傳入傳出引數

exceptfds: 監控異常發生達檔案描述符集合,如帶外資料到達異常,傳入傳出引數

timeout: 定時阻塞監控時間,3種情況

1.null,永遠等下去

2.設定timeval,等待固定時間

3.設定timeval裡時間均為0,檢查描述字後立即返回,輪詢

struct timeval

;void

fd_clr

(int fd, fd_set *set)

;//把檔案描述符集合裡fd清0

intfd_isset

(int fd, fd_set *set)

;//測試檔案描述符集合裡fd是否置1

void

fd_set

(int fd, fd_set *set)

;//把檔案描述符集合裡fd位置1

void

fd_zero

(fd_set *set)

;//把檔案描述符集合裡所有位清0

流程

檢測cli陣列中有沒有資料就緒,如果有就讀寫資料

**

#include

#include

#include

#include

#include

#include

// sockaddr_in

#include

#include

#include

#define port 6666

intmain()

struct sockaddr_in cli_addr;

socklen_t cli_addr_len =

sizeof

(cli_addr)

;bzero

(&cli_addr,

sizeof

(cli_addr));

char cli_addr_str[bufsiz]

; fd_set readfds;

int nready;

int i;

int n;

char buf[bufsiz]

;int connect_fd;

while(1

)}if(i == fd_setsize)if(

--nready <=0)

continue

;// return while

}for

(i =

0; i <= maxi; i++

)else

if(n >0)

write

(socket_fd, buf, n)

;write

(stdout_fileno, buf, n)

;//輸出到螢幕,主觀大小為n而不是bufsiz}if

(--nready <=0)

break;}

}}close

(listen_fd)

;// 關閉伺服器端

return0;

}

網路程式設計 多路I O轉接伺服器之epoll

相關api 建立乙個epoll控制代碼,引數size用來告訴核心監聽的檔案描述符的個數,跟記憶體大小有關。此步驟建立乙個建議大小為size的紅黑樹 二叉平衡樹 返回值為根結點的fd include intepoll create int size size 監聽數目控制某個epoll監控的檔案描述符...

I O多路轉接之poll伺服器

函式說明 include int poll struct pollfd fds,nfds t nfds,int timeout 引數說明 fds 是乙個struct pollfd結構型別的陣列,用於存放需要檢測其狀態的socket描述符 每當呼叫這個函式之後,系統不會清空這個陣列,操作起來比較方便 ...

I O多路轉接 epoll伺服器

在前面的兩篇部落格中,我們介紹了最早期的select和改進版的poll 但是,他兩都沒有改進的就是,想要快速知道事件就緒並沒有得到改進,兩個全部是遍歷陣列,我們都知道它的時間複雜度就是o n 效率不是很高,時間複雜度達到o 1 才是高效的 epoll是linux特有的i o復用函式,它在實現和使用上...