1、程序初始化
創建監聽socket
調用bind函數綁定ip地址、port端口號
調用listen函數監聽
調用epoll_create函數創建epollfd
調用epoll_ctrl函數將listenfd綁定到epollfd上,監測listenfd的讀事件
在一個無限循環中,調用epoll_wait函數等待事件發生
2、處理客戶端請求
1、客戶端連接
操作系統檢測到監聽fd上有讀事件,導致epoll_wait從阻塞狀態返回,上報監聽fd上讀事件,
調用accept函數接受連接,返回與客戶端對應的的clientfd,將clientfd設置為非阻塞,調用epoll_ctrl將clientfd綁定到epollfd上,綁定時設置監聽clientfd的讀事件,此時還不能監聽該clientfd的寫事件。
2、客戶端給服務器發數據
epoll_wait函數返回,并表明該clientfd上有讀事件,調用recv函數接收數據,
若recv返回0,說明對端關閉了連接,調用epoll_ctrl將clientfd從epollfd上卸載,并關閉該clientfd;
若recv返回大于0,說明收到了數據,將數據存起來,根據協議格式解包。如果是LT模式,則可以調用任意次recv收數據,如果是ET模式,必須一直調用recv直到數據收完,收完標志(recv返回-1,并且錯誤碼為EWOULDBLOCK)
3、服務器給客戶端發數據
一般直接調用send發數據,如果數據太大或tcp窗口太小數據發不出去(send返回-1,錯誤碼是EWOULDBLOCK,需要判斷是否有剩余數據),調用epoll_ctrl將clientfd綁定到epollfd上,監聽該clientfd寫事件,如果epoll_wait返回了并告訴clientfd上有寫事件,繼續發數據,如果數據還是發送不完,繼續等待下一次寫事件,一旦數據全部發完,移除epoll上該clientfd的寫事件監聽。
學習鏈接:https://github.com/0voice