1.一种基于TCP/IP通信协议的在线客户端数量的统计系统,其特征在于,包括:服务器及与所述服务器TCP连接的至少一客户端,所述服务器用于创建动态链表,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,每个结点包括:客户端数据域和存储下一个结点地址的指针域next;
所述服务器通过调用epoll_wait函数,判断所述客户端是否有通信事件触发,若是,退出epoll_wait函数,遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发;
其中,所述通信事件包括新的客户端发起TCP连接请求事件、已经建立连接的客户端断开TCP连接的事件、已经建立TCP连接的客户端有上线命令传输的事件、已经建立TCP连接的客户端有心跳包命令传输的事件、及心跳包监测的定时器中断服务事件。
2.根据权利要求1所述的基于TCP/IP通信协议的在线客户端数量的统计系统,其特征在于,每个结点的长度等于当前与所述服务器建立TCP连接的客户端数量。
3.根据权利要求1所述的基于TCP/IP通信协议的在线客户端数量的统计系统,其特征在于,所述客户端数据域包括:存储所述客户端ID的字符数组类型变量id,存储所述服务器给当前上线客户端分配的socket文件描述符的整型变量fd,用于所述服务器心跳包丢失统计的整型变量heartbeat_lost_count。
4.一种基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,包括下述步骤:
步骤S110:对所述服务器Socket通信参数进行初始化;
步骤S120:所述服务器建立并监听socket套接字描述符socket_fd;
步骤S130:对所述服务器的模型epoll进行初始化;
步骤S140:所述服务器创建动态链表并启动控制心跳包的系统定时器;
步骤S150:所述服务器调用epoll_wait函数,并判断所述客户端是否有通信事件触发,若是,退出epoll_wait函数,所述服务器遍历并处理所述通信事件;若否,采用阻塞的方式等待客户端通信事件的触发;
其中,所述动态链表包括一头结点和若干子结点,以所述头结点为起始,每个结点通过指针域next依次串联构成所述动态链表,每个结点包括:客户端数据域和存储下一个结点地址的指针域next;
其中,所述通信事件包括新的客户端发起TCP连接请求事件、已经建立连接的客户端断开TCP连接的事件、已经建立TCP连接的客户端有上线命令传输的事件、已经建立TCP连接的客户端有心跳包命令传输的事件、及心跳包监测的定时器中断服务事件。
5.根据权利要求4所述的基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为新的客户端发起TCP连接请求命令,具体包括下述步骤:
epoll_wait函数发现触发待处理的事件刚好等于监听套接字描述符socket_fd;
根据socket_fd调用accept函数返回新的socket套接字描述符,记为fd;
将侦听到的fd通过epoll_ctl函数添加到epoll句柄当中。
6.根据权利要求4所述的基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为已经建立连接的客户端断开TCP连接的事件,具体包括下述步骤:
epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;
根据fd调用read函数;
判断read函数返回值是否等于0,若是,进行下一步;若否,进行其他事务处理;
根据发起断开请求的客户端的fd查找结点所在位置,并将结点从所述动态链表中删除。
7.根据权利要求4所述的基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为已经建立TCP连接的客户端有上线命令传输的事件,具体包括下述步骤:
epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;
根据fd调用read函数;
判断read函数返回值是否大于0,若是,进行下一步;若否,进行其他处理;
判断数据包是否为HEL;xxxxxxxxxxx;@的格式,其中,HEL是hello的缩写,xxxxxxxxxxx是所述客户端的ID,用分号";"隔开,最后以@结束,若是,进行下一步;若否,进行其他事务处理;
对所述xxxxxxxxxxx和分配该客户端的fd进行提取,以开辟新结点,并将所述xxxxxxxxxxx和fd分别存储到新结点的id和fd中,且将heartbeat_lost_count初始化为0;
将所述新节点添加到所述动态链表的结尾。
8.根据权利要求4所述的基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为已经建立TCP连接的客户端有心跳包命令传输的事件,具体包括下述步骤:
epoll_wait函数发现触发待处理的事件为socket套接字描述符,记为fd;
根据fd调用read函数;
判断read函数返回值是否大于0,若是,进行下一步;若否,进行其他处理;
判断数据包是否为HEART;xxxxxxxxxxx;@的格式,其中,xxxxxxxxxxx是所述客户端的ID,用分号";"隔开,最后以@结束,若是,进行下一步;若否,进行其他事务处理;
根据客户端的ID查找客户端所在的动态链表中的结点位置;
将查到的和该客户端对应结点中的heartbeat_lost_count清零。
9.根据权利要求4所述的基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,在步骤S150中,所述服务器遍历并处理所述通信事件,当所述通信事件为心跳包监测的定时器中断服务事件,具体包括下述步骤:
判断当前遍历到的结点地址是否等于NULL;若是进下一步;
给所述动态链表中当前遍历到结点的heartbeat_lost_count按1步进递增;
判断heartbeat_lost_count是否大于5,若是,进行下一步;若否,遍历下一个结点;
判定为超时未发送心跳包,根据客户端的fd查找结点所在位置并将结点从动态链表中删除;
遍历下一个结点,并返回第一步。
10.根据权利要求4所述的基于TCP/IP通信协议的在线客户端数量的统计方法,其特征在于,每个结点的长度等于当前与所述服务器建立TCP连接的客户端数量,所述客户端数据域包括:存储所述客户端ID的字符数组类型变量id,存储所述服务器给当前上线客户端分配的socket文件描述符的整型变量fd,用于所述服务器心跳包丢失统计的整型变量heartbeat_lost_count。