C语言利用epoll实现聊天室

  1. 通信模型:服务器端与客户端采用C/S模型,TCP连接。

C语言利用epoll实现聊天室

  1. TCP服务端通信的常规步骤:

(1)使用 socket()创建 TCP 套接字(socket)

(2)将创建的套接字绑定到一个本地地址和端口上(Bind)

(3)将套接字设为监听模式,准备接收客户端请求(listen)

(4)等待客户请求到来: 当请求到来后,接受连接请求,返回一个对应于此次连接的新的套接字(accept)

(5)用 accept 返回的套接字和客户端进行通信(使用write()/send()或send()/recv() )

(6)返回,等待另一个客户请求

(7)关闭套接字

Socket-bind-listen步骤:

C语言利用epoll实现聊天室

 

  1. TCP 客户端通信的常规步骤:

(1)创建套接字(socket)

(2)使用 connect() 建立到达服务器的连接(connect)

(3)客户端进行通信(使用 write()/send() 或 send()/recv() )

(4)使用 close() 关闭客户连接

C语言利用epoll实现聊天室

代码解释:

  1. sockaddr_in是处理网络通信地址的结构体,在头文件#include<netinet/in.h>#include <arpa/inet.h>中定义,该结构体解决了sockaddr的缺陷,把port(端口信息)和addr(目标地址)分开储存在两个变量中。

    C语言利用epoll实现聊天室

用htons()函数将普通数字转换成网络数据格式的数字。

 

  1. 基本技术:
  1. 非阻塞socket:对一个文件描述符指定的设备或文件,如果没有数据读写则程序马上返回不会等待。将socket设置为非阻塞方式。这样能充分利用服务器资源,效率得到了很大提高。(文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。
  2. 高效的Epoll机制(Linux特有的I/O函数),选择ET(边沿触发)方式。当一个事件发生(比如说读事件),epoll 无须遍历整个被侦听的描述符集,只要遍历那些被内核 IO 事件异步唤醒而加入就绪队列的描述符集合就行了

服务端使用 epoll 的时候,步骤如下:

  1. 调用 epoll_create 函数在 Linux 内核中创建一个事件表;
  2. 然后将文件描述符(监听套接字 listener )添加到所创建的事件表中;
  3. 在主循环中,调用 epoll_wait 等待返回就绪的文件描述符集合;
  4. 别处理就绪的事件集合,本项目中一共有两类事件:新用户连接事件和用户发来消息事件( epoll 还有很多其他事件,本项目为简洁明了,不介绍)。