思路
利用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復用函式,它在實現和使用上...