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 等待返回就緒的文件描述符集合;
- 分別處理就緒的事件集合,本項目中一共有兩類事件:新用戶連接事件和用戶發來消息事件。