C語言簡單實現epoll服務器(一)


C/S模型

TCP通信C/S模型圖如下所示:

TCP服務端通信的常規步驟:

  • 使用 socket() 創建 TCP 套接字(socket)
  • 將創建的套接字綁定到一個本地地址和端口上(Bind)
  • 將套接字設為監聽模式,准備接收客戶端請求(listen)
  • 等待客戶請求到來: 當請求到來后,接受連接請求,返回一個對應於此次連接的新的套接字(accept)
  • 用 accept 返回的套接字和客戶端進行通信(使用 write() / send() 或 send() / recv() )返回,等待另一個客戶請求關閉套接字

 

TCP客戶端通信的常規步驟:

  • 創建套接字(socket)
  • 使用 connect() 建立到達服務器的連接(connect)
  • 客戶端進行通信(使用 write() / send() 或 send() / recv() )
  • 使用 close() 關閉客戶連接

 

epoll函數介紹:

int epoll_create(int size)

//創建一個epoll句柄,參數size用來告訴內核監聽的數目,size為epoll所支持的最大句柄數
 

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)

//函數功能: epoll事件注冊函數

//參數epfd為epoll的句柄,即epoll_create返回值

//參數op表示動作,用3個宏來表示: 

EPOLL_CTL_ADD//(注冊新的fd到epfd),

EPOLL_CTL_MOD//(修改已經注冊的fd的監聽事件),

EPOLL_CTL_DEL//(從epfd刪除一個fd);

 

//其中參數fd為需要監聽的標示符;

//參數event告訴內核需要監聽的事件,event的結構如下:

struct epoll_event {

    __uint32_t events; //Epoll events

      epoll_data_t data; //User data variable

}; 

 

服務端調用epoll步驟如下:

  • 調用 epoll_create 函數在 Linux 內核中創建一個事件表;
  • 然后將文件描述符(監聽套接字 listener )添加到所創建的事件表中;
  • 在主循環中,調用 epoll_wait 等待返回就緒的文件描述符集合;
  • 分別處理就緒的事件集合,本項目中一共有兩類事件:新用戶連接事件和用戶發來消息事件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM