CN106254179A - 一种心跳包异步控制方法及装置 - Google Patents
一种心跳包异步控制方法及装置 Download PDFInfo
- Publication number
- CN106254179A CN106254179A CN201610635890.2A CN201610635890A CN106254179A CN 106254179 A CN106254179 A CN 106254179A CN 201610635890 A CN201610635890 A CN 201610635890A CN 106254179 A CN106254179 A CN 106254179A
- Authority
- CN
- China
- Prior art keywords
- client
- server
- node
- heartbeat packet
- heartbeat
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L43/00—Arrangements for monitoring or testing data switching networks
- H04L43/10—Active monitoring, e.g. heartbeat, ping or trace-route
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/14—Session management
- H04L67/143—Termination or inactivation of sessions, e.g. event-controlled end of session
- H04L67/145—Termination or inactivation of sessions, e.g. event-controlled end of session avoiding end of session, e.g. keep-alive, heartbeats, resumption message or wake-up for inactive or interrupted session
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/50—Network services
- H04L67/54—Presence management, e.g. monitoring or registration for receipt of user log-on information, or the connection status of the users
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/16—Implementation or adaptation of Internet protocol [IP], of transmission control protocol [TCP] or of user datagram protocol [UDP]
- H04L69/161—Implementation details of TCP/IP or UDP/IP stack architecture; Specification of modified or new header fields
- H04L69/162—Implementation details of TCP/IP or UDP/IP stack architecture; Specification of modified or new header fields involving adaptations of sockets based mechanisms
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Health & Medical Sciences (AREA)
- Cardiology (AREA)
- General Health & Medical Sciences (AREA)
- Computer Security & Cryptography (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明涉及心跳包控制技术领域,特别涉及一种心跳包异步控制方法及装置。所述心跳包异步控制方法包括:步骤A:服务器套接字通信参数初始化及服务器通信模型初始化,建立监听套接字描述符;步骤B:建立和初始化服务器动态链表;步骤C:初始化并启动控制心跳包的系统定时器;步骤D:调用监听函数,判断是否有客户端通信事件的触发,如果有客户端通信事件的触发,则服务器主程序退出监听函数,服务器遍历并处理通信事件;如果没有客户端通信事件的触发,则继续等待客户端通信事件的触发。本发明采用linux系统的Epoll服务器模型,简单可靠高效,克服了多线程编程和协议复杂的问题,充分利用系统内存资源并高效地对心跳包数据进行处理。
Description
技术领域
本发明涉及心跳包控制技术领域,特别涉及一种心跳包异步控制方法及装置。
背景技术
心跳包通常是客户端每隔一小段时间向服务器发送的数据包,通知服务器自己仍然在线,并传输一些可能有必要的数据,服务端收到后回复一个固定信息,如果服务端在规定的时间内没有收到客户端信息则视客户端断开。因按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。心跳包的内容没有特别规定,一般都是很小的包或者只是包含包头的一个空包。
心跳包在可穿戴式设备与远程服务器通信当中非常关键,因为目前大部分穿戴式设备都是采用GRPS网络与远程服务器进行双向通信,当网络运营商检测到GPRS数据终端在一定时间内没有传输数据,就会将该连接掐断,因此需要一种机制,在用户没有数据收发的时候来保证连接不会被掐断。心跳包的设置正是为了解决上述问题,心跳包的设置也方便远程服务器进行在线监测。
目前有一种普遍的方法是采用TCP/IP协议层内置的KeepAlive功能来实现心跳功能,不论是服务端还是客户端,一方开启KeepAlive功能后,就会自动在规定时间内向对方发送心跳包,而另一方在收到心跳包后就会自动回复,以告诉对方我仍然在线。该机制简单可靠,但存在如下缺点:SO_KEEPALIVE无法控制,它会每时每刻都发;SO_KEEPALIVE设置空闲2小时才发送一个“保持存活探测分节”,不能保证实时检测,因此对于判断网络断开时间太长,对于需要及时响应的程序不太适应。当然也可以修改时间间隔参数,但是会影响到所有打开此选项的套接口,关联了完成端口的socket可能会忽略掉该套接字选项。另外比较常用的另一种方法是采用多线程,在接收和发送数据时个人设计一个守护进程,定时发送Heart-Beat包,客户端/服务器收到该小包后,立刻返回相应的包即可检测对方是否实时在线。但上述方法的缺点在于:对于操作系统而言,进程和线程的开辟,如果在线客户端数量庞大,那么无论是客户端的心跳包监测,还是例行的数据接收和发送,都要频繁的开辟和销毁线程,这个对系统也是一种不小的开销,而且编程比较复杂,难以保证多线程通信的同步,容易导致线程的死锁。
发明内容
本发明提供了一种心跳包异步控制方法及装置,旨在至少在一定程度上解决现有技术中的上述技术问题之一。
为了解决上述问题,本发明提供了如下技术方案:
一种心跳包异步控制方法,其特征在于,包括:
步骤A:服务器套接字通信参数初始化及服务器通信模型初始化,建立监听套接字描述符;
步骤B:建立和初始化服务器动态链表;
步骤C:初始化并启动控制心跳包的系统定时器;
步骤D:调用监听函数,判断是否有客户端通信事件的触发,如果有客户端通信事件的触发,则服务器主程序退出监听函数,服务器遍历并处理通信事件;如果没有客户端通信事件的触发,则继续等待客户端通信事件的触发。
本发明实施例采取的技术方案还包括:在所述步骤B中,建立的服务器动态链表包括一个头结点和若干结点,每一个结点包括:客户端数据域和存储下一个结点地址的指针域next,每个结点通过指针域next连接起来构成一个动态链表,所述结点的长度等于当前与服务器建立TCP连接的客户端数量;所述客户端数据域包括:存储客户端ID的字符数组类型变量id,存储服务器给当前上线客户端分配的socket文件描述符的整型变量fd,存储丢失的心跳包个数的整型变量heartbeat_lost_count。
本发明实施例采取的技术方案还包括:所述步骤C还包括:启动定时器中断服务函数,通过定时器中断服务函数对服务器动态链表进行遍历,给每一个结点的heartbeat_lost_count按照1的步进递增,对每一个结点的heartbeat_lost_count的值进行判断,如果heartbeat_lost_count大于预设值,则服务器认为该客户端丢失心跳包的时间大于预设值,服务器根据客户端的fd查找客户端所在链表的结点位置,强制将客户端所在的结点删除掉,并给客户端返回错误信息,断开与所述客户端的TCP连接。
本发明实施例采取的技术方案还包括:在所述步骤D中,所述监听函数为epoll_wait函数,所述客户端通信事件包括:新的客户端发起TCP连接请求、已经建立连接的客户端断开TCP连接的请求、已经建立连接的客户端有数据传输和已经建立连接的客户端异常断开TCP连接。
本发明实施例采取的技术方案还包括:在所述步骤D中,监听函数发现触发待处理的事件刚好等于监听套接字描述符socket_fd;根据socket_fd调用accept函数返回新的socket套接字描述符;将侦听到的socket_fd通过epoll_ctl函数添加到epoll句柄当中,已经建立连接的新的客户端如果后续有数据传输,系统利用socket_fd与该客户端进行双向通信。
本发明实施例采取的技术方案还包括:在所述步骤D中,epoll_wait函数发现触发待处理的事件为fd;根据fd调用read函数;判断read返回值是否大于0,如果不大于0,判断read返回值是否等于0,如果read返回值等于0,根据发起断开请求的客户端的fd查找结点所在位置并将结点从链表中删除掉,然后将该删除的结点的前后结点通过结点的指针域next连接起来构成新的链表;如果read返回值不等于0,进行异常处理;read返回值大于0,判断数据包的格式,如果符合预定格式,则对分配给该客户端的fd进行提取,并将它们分别存储到结点的id和fd当中,将fd和id建立映射关系,将该结点添加到动态链表的结尾;如果不符合预定格式,根据协议对其他数据包括或者命令进行判断并处理。
本发明实施例采取的另一技术方案为:一种心跳包异步控制装置,包括:通信参数初始化模块、通信模型初始化模块、动态链表初始化模块、系统定时器启动及初始化模块、监听函数调用模块,所述通信参数初始化模块用于初始化服务器套接字通信参数,建立监听套接字描述符;所述通信模型初始化模块用于初始化服务器通信模型;所述动态链表初始化模块用于建立和初始化服务器动态链表;所述系统定时器启动及初始化模块用于初始化并启动控制心跳包的系统定时器;所述监听函数调用模块用于调用监听函数,判断是否有客户端通信事件的触发,如果有客户端通信事件的触发,服务器主程序退出监听函数,服务器遍历并处理通信事件,如果没有客户端通信事件的触发,则继续等待客户端通信事件的触发。
本发明实施例采取的技术方案还包括:所述服务器动态链表包括一个头结点和若干结点,每一个结点包括两部分:客户端数据域和存储下一个结点地址的指针域next,每个结点通过指针域next连接起来构成一个动态链表,所述结点的长度等于当前与服务器建立TCP连接的客户端数量。
本发明实施例采取的技术方案还包括:所述客户端数据域包括:存储客户端ID的字符数组类型变量id,存储服务器给当前上线客户端分配的socket文件描述符的整型变量fd,存储丢失的心跳包个数的整型变量heartbeat_lost_count。
本发明实施例采取的技术方案还包括:所述系统定时器启动及初始化模块还用于启动定时器中断服务函数,通过定时器中断服务函数对服务器动态链表进行遍历,给每一个结点的heartbeat_lost_count按照1的步进递增,对每一个结点的heartbeat_lost_count的值进行判断,如果heartbeat_lost_count大于预设值,则服务器认为该客户端丢失心跳包的时间大于预设值,服务器将根据客户端的fd查找客户端所在链表的结点位置,强制将客户端所在的结点删除掉,并给客户端返回错误信息,断开与所述客户端的TCP连接。
相对于现有技术,本发明实施例产生的有益效果在于:本发明实施例的心跳包异步控制方法及装置采用linux系统的Epoll服务器模型,简单可靠高效,克服了多线程编程和协议复杂的问题,仅需一个进程就可以实现数以万计的socket通信,此外,采用动态链表的机制来实现客户端上线管理和多客户端心跳包监测,简单且灵活,因链表的长度是跟随用户数量的变化而动态的变化的,因此能够充分利用系统内存资源并高效地对心跳包数据进行处理;客户端发送心跳包的周期可变,针对某客户端,服务器发送心跳包的周期与该客户端发送心跳包的周期一致,如果因为网络故障导致服务器在规定时间内收不到某上线的客户端的心跳包就将对该客户端进行断线的处理。
附图说明
图1是本发明实施例的心跳包异步控制方法的流程图;
图2是本发明实施例的维护客户端通信的链表结构示意图;
图3是心跳包监测的定时器中断服务函数的运行流程图;
图4是本发明实施例的心跳包异步控制方法处理新的客户端发起TCP连接请求的流程图;
图5是本发明实施例的心跳包异步控制方法处理已经建立连接的客户端断开TCP连接的请求或者已经建立连接的客户端发送上线和心跳包命令的事件的流程图;
图6是当前在线的客户端链表的示意图;
图7是有新的客户端上线后的新链表示意图;
图8是已经建立连接的客户端发起断开请求的链表示意图;
图9是将发起断开请求的客户端从链表中删除并重构链表的示意图;
图10是本发明实施例的心跳包异步控制装置的结构示意图;
图11是服务器压力测试模拟示意图;
图12是客户端的TCP/IP调试工具模拟示意图;
图13是上线客户端信息显示图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
请参阅图1,是本发明实施例的心跳包异步控制方法的流程图。本发明实施例中的心跳包异步控制方法包括:
步骤10:服务器Socket通信参数初始化,建立监听socket描述符socket_fd;
在步骤10中,Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
步骤20:服务器通信模型epoll初始化;
在步骤20中,epoll是一种高效的管理socket的模型。
步骤30:建立和初始化服务器动态链表;
在步骤30中,建立的服务器动态链表是仅包含头结点的链表,用来对客户端进行维护管理,该链表的结点数据结构id_fd_node定义如下:
typedef struct id_fd_str
{
char id[13];//存储ID的字符数组
int fd;//存储Socket的fd
int heartbeat_lost_count;//存储丢失的心跳包个数
struct id_fd_str*next;//存储指向下一个结点的地址
}id_fd_node;
请一并参阅图2,图2是本发明实施例的维护客户端通信的链表结构示意图。该链表包括一个头结点和若干结点,每一个结点包括两部分:客户端数据域和存储下一个结点地址的指针域next,每个结点通过指针域next连接起来构成一个动态链表,头结点指向第一个结点,第一个结点指向第二个结点,依次类推,最后一个结点不再指向其他结点,因此指针域用”null”填充。结点的长度等于当前与服务器建立TCP连接的客户端数量,客户端数据域包括三部分:存储客户端ID的字符数组类型变量id,存储服务器给当前上线客户端分配的socket文件描述符的整型变量fd,存储丢失的心跳包个数的整型变量heartbeat_lost_count。
步骤40:初始化并启动控制心跳包的系统定时器;
在步骤40中,启动控制心跳包的系统定时器后,会启动一个定时器中断服务函数,请一并参阅图3,为心跳包监测的定时器中断服务函数的运行流程图。在定时器中断服务函数中,对链表进行遍历,给每一个结点的heartbeat_lost_count按照1的步进递增,然后对每一个结点的heartbeat_lost_count的值进行判断,如果heartbeat_lost_count大于预设值,那么服务器认为该客户端丢失心跳包的时间大于预设值(流程图中设为5),服务器将根据客户端的fd查找客户端所在链表的结点位置,强制将客户端所在的结点删除掉,那么动态链表的结构和长度将发生变化,并给客户端返回"connection time out!,pleaseonline again\r\n"的错误信息,然后断开与该客户端的TCP连接从而强制让其下线。正常情况下,因为服务器会按照客户端发心跳包的频率给客户端回应心跳包(也就是客户端的ID号),并将heartbeat_lost_count清零,因此定时器中断服务函数中的heartbeat_lost_count是不会超过预设值的,只有因为网络原因服务器接收不到客户端的心跳包命令从而不能及时给heartbeat_lost_count清零,导致在定时器中断服务函数中不断的对heartbeat_lost_count递增才会超过预设值。
步骤50:调用监听函数,判断是否有客户端通信事件的触发,如果有客户端通信事件的触发,则进入步骤60,如果没有客户端通信事件的触发,则进入步骤80;
在步骤50中,调用监听函数为epoll_wait函数,客户端通信事件包括:新的客户端发起TCP连接请求、已经建立连接的客户端断开TCP连接的请求、已经建立连接的客户端有数据(命令)传输(包括上线命令和心跳包命令)、已经建立连接的客户端异常断开TCP连接。
步骤60:服务器主程序退出监听函数;
步骤70:服务器遍历并处理通信事件;
步骤80:继续等待客户端通信事件的触发。
在步骤80中,采用阻塞方式继续等待客户端通信事件的触发。
请参阅图4,是本发明实施例的心跳包异步控制方法处理新的客户端发起TCP连接请求的流程图。本发明实施例的心跳包异步控制方法处理新的客户端发起TCP连接请求包括:
步骤100:epoll_wait函数发现触发待处理的事件刚好等于监听套接字描述符socket_fd;
步骤110:根据socket_fd调用accept函数返回新的socket套接字描述符(下文用fd表示);
步骤120:将侦听到的fd通过epoll_ctl函数添加到epoll句柄当中,已经建立连接的新的客户端如果后续有数据传输,那么系统会利用fd与该客户端进行双向通信。
请参阅图5,是本发明实施例的心跳包异步控制方法处理已经建立连接的客户端断开TCP连接的请求或者已经建立连接的客户端发送上线和心跳包命令的事件的流程图。本发明实施例的心跳包异步控制方法处理已经建立连接的客户端断开TCP连接的请求或者已经建立连接的客户端发送上线和心跳包命令的事件包括:
步骤400:epoll_wait函数发现触发待处理的事件为fd(即已经建立连接的客户发起);
步骤401:根据fd调用read函数;
步骤402:判断read返回值是否大于0,如果不大于0,则进入步骤403,如果大于0则进入步骤404;
步骤403:判断read返回值是否等于0,如果read返回值等于0,则进入步骤411,如果read返回值不等于0,则进入步骤412;
步骤404:判断数据包是否为HEL HEL;xxxxxxxxxxx;@的格式,其中HEL是hello的缩写,意思是向服务器打招呼,xxxxxxxxxxx是客户端的ID(手机号),用分号";"隔开,最后以@结束,如果是则进入步骤405,如果不是则进入步骤407;
步骤405:服务器收到“HEL;xxxxxxxxxxx;@”的命令后,将会对xxxxxxxxxxx和分配给该客户端的fd进行提取,并将它们分别存储到结点的id和fd当中以便将fd和id建立映射关系,并对结点中的heartbeat_lost_count初始化为0;
步骤406:将该结点添加到动态链表的结尾,至此,客户端完成了与服务器连接并且上线的操作,那么动态链表的结构和长度将发生变化(如图6,图7所示,图6是当前在线的客户端链表的示意图,图7是有新的客户端上线后的新链表示意图,在图6和图7中,如果有新的客户端发起上线操作,将重复刚才的流程,并在链表的结尾添加新的结点)。
步骤407:判断数据包是否为:HEART;xxxxxxxxxxx;@的格式,其中HEART为心跳包命令同步头,xxxxxxxxxxx为客户端的ID号,如果是则进入步骤408,否则进入步骤410;
步骤408:根据客户端的ID号查找该客户端所在链表当中的结点位置;
步骤409:将查找到的跟该客户端对应的结点中的heartbeat_lost_count清零;
步骤410:根据协议对其他数据包括或者命令进行判断并处理。
步骤411:根据发起断开请求的客户端的fd查找结点所在位置并将结点从链表中删除掉,然后将该删除的结点的前后结点通过结点的指针域next连接起来构成新的链表,假设删除结点编号为2,那么删除前后的链表变化如图8和图9表示。图8是已经建立连接的客户端(结点2)发起断开请求的链表示意图。图9是将发起断开请求的客户端(对应结点2)从链表中删除并重构链表的示意图。
步骤412:进行异常处理。
请参阅图10,是本发明实施例的心跳包异步控制装置的机构示意图。本发明实施例中的心跳包异步控制装置包括:通信参数初始化模块、通信模型初始化模块、动态链表初始化模块、系统定时器启动及初始化模块、监听函数调用模块。
通信参数初始化模块用于初始化服务器Socket通信参数,建立监听socket套接字描述符socket_fd。
通信模型初始化模块用于初始化服务器通信模型epoll,其中,epoll是一种高效的管理socket的模型。
动态链表初始化模块用于建立和初始化服务器动态链表。建立的服务器动态链表是仅包含头结点的链表,用来对客户端进行维护管理,该链表的结点数据结构id_fd_node定义如下:
typedef struct id_fd_str
{
char id[13];//存储ID的字符数组
int fd;//存储Socket的fd
int heartbeat_lost_count;//存储丢失的心跳包个数
struct id_fd_str*next;//存储指向下一个结点的地址
}id_fd_node;
请参阅图2,图2是本发明实施例的维护客户端通信的链表结构示意图。该链表包括一个头结点和若干结点,每一个结点包括两部分:客户端数据域和存储下一个结点地址的指针域next,每个结点通过指针域next连接起来构成一个动态链表,头结点指向第一个结点,第一个结点指向第二个结点,依次类推,最后一个结点不再指向其他结点,因此指针域用”null”填充。结点的长度等于当前与服务器建立TCP连接的客户端数量,客户端数据域包括三部分:存储客户端ID的字符数组类型变量id,存储服务器给当前上线客户端分配的socket文件描述符的整型变量fd,存储丢失的心跳包个数的整型变量heartbeat_lost_count。
系统定时器启动及初始化模块用于初始化并启动控制心跳包的系统定时器;启动控制心跳包的系统定时器后,系统定时器启动及初始化模块会启动一个定时器中断服务函数。请一并参阅图3,为心跳包监测的定时器中断服务函数的运行流程图。在定时器中断服务函数中,对链表进行遍历,给每一个结点的heartbeat_lost_count按照1的步进递增,然后对每一个结点的heartbeat_lost_count的值进行判断,如果heartbeat_lost_count大于预设值,那么服务器认为该客户端丢失心跳包的时间大于预设值(流程图中设为5),服务器将根据客户端的fd查找客户端所在链表的结点位置,强制将客户端所在的结点删除掉,那么动态链表的结构和长度将发生变化,并给客户端返回"connection time out!,pleaseonline again\r\n"的错误信息,然后断开与该客户端的TCP连接从而强制让其下线。正常情况下,因为服务器会按照客户端发心跳包的频率给客户端回应心跳包(也就是客户端的ID号),并将heartbeat_lost_count清零,因此定时器中断服务函数中的heartbeat_lost_count是不会超过预设值的,只有因为网络原因服务器接收不到客户端的心跳包命令从而不能及时给heartbeat_lost_count清零,导致在定时器中断服务函数中不断的对heartbeat_lost_count递增才会超过预设值。
监听函数调用模块用于调用监听函数,判断是否有客户端通信事件的触发,如果有客户端通信事件的触发,服务器主程序退出监听函数,服务器遍历并处理通信事件,如果没有客户端通信事件的触发,则继续等待客户端通信事件的触发。
监听函数调用模块调用监听函数为epoll_wait函数,客户端通信事件包括:新的客户端发起TCP连接请求;已经建立连接的客户端断开TCP连接的请求;已经建立连接的客户端有数据(命令)传输(包括上线命令和心跳包命令);已经建立连接的客户端异常断开TCP连接。
请参阅图11、图12和图13,图11是服务器压力测试模拟示意图,图12是客户端的TCP/IP调试工具模拟示意图,图13是上线客户端信息显示图。本发明实施例的心跳包异步控制方法及装置通过TCP/IP调试工具来模拟客户端,用其来发送上线命令和按一定周期发送心跳包,服务器能够按照前面所述流程处理,上线信息显示在前端web网页当中。
本发明实施例的心跳包异步控制方法及装置通过在服务器维护着一个动态链表,链表的长度可弹性缩放,长度取决与当前在线(登陆)的客户端数量,每一个结点代表着一个客户端,一旦有新的客户端发起TCP连接请求,就将其信息填充到新的结点并插入原链表的尾部,一旦已经建立TCP连接的客户端发起断开请求(包括主动发起或者异常断开的情况),服务器就将其从链表结构当中剔除掉。由于链表的结点是根据需要动态开辟的,因此相比需要实现定义固定长度的数组结构而言,极大的提高内存使用效率,由于是通过指针域操作链表的结点,因此访问效率极高。满足了服务器对于海量客户端并发连接和并发通信的高速要求。
另外,定时器中断服务函数触发时间是等间隔的,不受任何客户端心跳包周期的影响,不因客户端心跳包周期的不同和变化,而且可以高速的对链表的结点进行遍历,及时的对异常断开的客户端所在的结点进行清理,从而将内存回收再利用,因此可以实时监测多客户端的并发心跳包并进行客户端上下线管理。
为了提高服务器处理数据的实时性和增强CPU使用效率,服务器采用阻塞方式等待客户端通信事件的触发,只要收到客户端的心跳包,服务器立马返回,因为服务器处理速度极快,因此,服务器给每一个客户端回应心跳包的频率都可以不一样,取决于并且等于该客户端给服务器端发送心跳包的频率。从而增强服务器对客户端的兼容性。
客户端每次上线系统分配的fd都是随机的,具有不确定性,但是在系统中每一个客户端的ID都是固定的,本系统通过上线命令和心态包命令,结合动态链表的建立和操作,可以完美的将fd和用户的ID动态绑定起来,无论客户端在什么终端登录,服务器都能够识别。
本发明实施例的心跳包异步控制方法及装置采用linux系统的Epoll服务器模型,简单可靠高效,克服了多线程编程和协议复杂的问题,仅需一个进程就可以实现数以万计的socket通信,此外,采用动态链表的机制来实现客户端上线管理和多客户端心跳包监测,简单且灵活,因链表的长度是跟随用户数量的变化而动态的变化的,因此能够充分利用系统内存资源并高效地对心跳包数据进行处理。客户端发送心跳包的周期可变,针对某客户端,服务器发送心跳包的周期与该客户端发送心跳包的周期一致,如果因为网络故障导致服务器在规定时间内收不到某上线的客户端的心跳包就将对该客户端进行断线的处理。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种心跳包异步控制方法,其特征在于,包括:
步骤A:服务器套接字通信参数初始化及服务器通信模型初始化,建立监听套接字描述符;
步骤B:建立和初始化服务器动态链表;
步骤C:初始化并启动控制心跳包的系统定时器;
步骤D:调用监听函数,判断是否有客户端通信事件的触发,如果有客户端通信事件的触发,则服务器主程序退出监听函数,服务器遍历并处理通信事件;如果没有客户端通信事件的触发,则继续等待客户端通信事件的触发。
2.根据权利要求1所述的心跳包异步控制方法,其特征在于,在所述步骤B中,建立的服务器动态链表包括一个头结点和若干结点,每一个结点包括:客户端数据域和存储下一个结点地址的指针域next,每个结点通过指针域next连接起来构成一个动态链表,所述结点的长度等于当前与服务器建立TCP连接的客户端数量;所述客户端数据域包括:存储客户端ID的字符数组类型变量id,存储服务器给当前上线客户端分配的socket文件描述符的整型变量fd,存储丢失的心跳包个数的整型变量heartbeat_lost_count。
3.根据权利要求2所述的心跳包异步控制方法,其特征在于,所述步骤C还包括:启动定时器中断服务函数,通过定时器中断服务函数对服务器动态链表进行遍历,给每一个结点的heartbeat_lost_count按照1的步进递增,然后对每一个结点的heartbeat_lost_count的值进行判断,如果heartbeat_lost_count大于预设值,则服务器认为该客户端丢失心跳包的时间大于预设值,服务器根据客户端的fd查找客户端所在链表的结点位置,强制将客户端所在的结点删除掉,并给客户端返回错误信息,断开与所述客户端的TCP连接。
4.根据权利要求1所述的心跳包异步控制方法,其特征在于,在所述步骤D中,所述监听函数为epoll_wait函数,所述客户端通信事件包括:新的客户端发起TCP连接请求、已经建立连接的客户端断开TCP连接的请求、已经建立连接的客户端有数据传输和已经建立连接的客户端异常断开TCP连接。
5.根据权利要求4所述的心跳包异步控制方法,其特征在于,在所述步骤D中,监听函数发现触发待处理的事件刚好等于监听套接字描述符socket_fd;根据socket_fd调用accept函数返回新的socket套接字描述符;将侦听到的socket_fd通过epoll_ctl函数添加到epoll句柄当中,已经建立连接的新的客户端如果后续有数据传输,系统利用socket_fd与该客户端进行双向通信。
6.根据权利要求4所述的心跳包异步控制方法,其特征在于,在所述步骤D中,epoll_wait函数发现触发待处理的事件为fd;根据fd调用read函数;判断read返回值是否大于0,如果不大于0,判断read返回值是否等于0,如果read返回值等于0,根据发起断开请求的客户端的fd查找结点所在位置并将结点从链表中删除掉,然后将该删除的结点的前后结点通过结点的指针域next连接起来构成新的链表;如果read返回值不等于0,进行异常处理;read返回值大于0,判断数据包的格式,如果符合预定格式,则对分配给该客户端的fd进行提取,并将它们分别存储到结点的id和fd当中,将fd和id建立映射关系,将该结点添加到动态链表的结尾;如果不符合预定格式,根据协议对其他数据包括或者命令进行判断并处理。
7.一种心跳包异步控制装置,其特征在于,包括:通信参数初始化模块、通信模型初始化模块、动态链表初始化模块、系统定时器启动及初始化模块、监听函数调用模块,所述通信参数初始化模块用于初始化服务器套接字通信参数,建立监听套接字描述符;所述通信模型初始化模块用于初始化服务器通信模型;所述动态链表初始化模块用于建立和初始化服务器动态链表;所述系统定时器启动及初始化模块用于初始化并启动控制心跳包的系统定时器;所述监听函数调用模块用于调用监听函数,判断是否有客户端通信事件的触发,如果有客户端通信事件的触发,服务器主程序退出监听函数,服务器遍历并处理通信事件,如果没有客户端通信事件的触发,则继续等待客户端通信事件的触发。
8.根据权利要求7所述的心跳包异步控制装置,其特征在于,所述服务器动态链表包括一个头结点和若干结点,每一个结点包括两部分:客户端数据域和存储下一个结点地址的指针域next,每个结点通过指针域next连接起来构成一个动态链表,所述结点的长度等于当前与服务器建立TCP连接的客户端数量。
9.根据权利要求8所述的心跳包异步控制装置,其特征在于,所述客户端数据域包括:存储客户端ID的字符数组类型变量id,存储服务器给当前上线客户端分配的socket文件描述符的整型变量fd,存储丢失的心跳包个数的整型变量heartbeat_lost_count。
10.根据权利要求9所述的心跳包异步控制装置,其特征在于,所述系统定时器启动及初始化模块还用于启动定时器中断服务函数,通过定时器中断服务函数对服务器动态链表进行遍历,给每一个结点的heartbeat_lost_count按照1的步进递增,对每一个结点的heartbeat_lost_count的值进行判断,如果heartbeat_lost_count大于预设值,则服务器认为该客户端丢失心跳包的时间大于预设值,服务器将根据客户端的fd查找客户端所在链表的结点位置,强制将客户端所在的结点删除掉,并给客户端返回错误信息,断开与所述客户端的TCP连接。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610635890.2A CN106254179B (zh) | 2016-08-05 | 2016-08-05 | 一种心跳包异步控制方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610635890.2A CN106254179B (zh) | 2016-08-05 | 2016-08-05 | 一种心跳包异步控制方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106254179A true CN106254179A (zh) | 2016-12-21 |
CN106254179B CN106254179B (zh) | 2020-07-24 |
Family
ID=58077897
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610635890.2A Active CN106254179B (zh) | 2016-08-05 | 2016-08-05 | 一种心跳包异步控制方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106254179B (zh) |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106375324A (zh) * | 2016-09-08 | 2017-02-01 | 深圳先进技术研究院 | 一种基于tcp/ip通信协议的网络通信系统及方法 |
CN106506253A (zh) * | 2016-09-08 | 2017-03-15 | 深圳先进技术研究院 | 一种基于tcp/ip通信协议的在线客户端数量的统计系统及方法 |
CN107734001A (zh) * | 2017-09-25 | 2018-02-23 | 龙尚科技(上海)有限公司 | 一种基于定时异步通信机制判断通信是否断开的方法 |
CN108289063A (zh) * | 2017-09-11 | 2018-07-17 | 上海金融期货信息技术有限公司 | 一种低延迟通讯系统 |
CN108566390A (zh) * | 2018-04-09 | 2018-09-21 | 中国科学院信息工程研究所 | 一种卫星应用层安全协议的实现方法及卫星消息监听与分发服务系统 |
CN108600029A (zh) * | 2018-05-09 | 2018-09-28 | 深圳壹账通智能科技有限公司 | 一种配置文件更新方法、装置、终端设备及存储介质 |
CN109445957A (zh) * | 2018-09-26 | 2019-03-08 | 迪瑞医疗科技股份有限公司 | 一种同步和异步通信控制方法、系统及装置 |
CN109547284A (zh) * | 2018-11-05 | 2019-03-29 | 北京长城华冠汽车科技股份有限公司 | 一种检测控制器局域网报文掉线的方法、装置和电动汽车 |
CN110011967A (zh) * | 2019-02-27 | 2019-07-12 | 新奥特(北京)视频技术有限公司 | 一种用于数据传输的方法和系统 |
CN110247844A (zh) * | 2019-05-23 | 2019-09-17 | 广州河东科技有限公司 | 一种智能家居网关实现多进程多协议的方法 |
CN113259432A (zh) * | 2021-05-12 | 2021-08-13 | 北京杰迈科技股份有限公司 | 一种基于tcp协议的通信方法及机器人远程控制系统 |
CN113411237A (zh) * | 2021-08-18 | 2021-09-17 | 成都丰硕智能数字科技有限公司 | 一种低延迟检测终端状态的方法、存储介质及系统 |
CN113626208A (zh) * | 2020-05-08 | 2021-11-09 | 许继集团有限公司 | 一种基于nio异步线程模型的服务器通信方法 |
CN115022751A (zh) * | 2022-08-04 | 2022-09-06 | 深圳市亿联无限科技有限公司 | 一种模块化的olt日志管理方法及系统 |
CN117118876A (zh) * | 2023-10-20 | 2023-11-24 | 美云智数科技有限公司 | 心跳连接检测方法、装置、电子设备及存储介质 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101035121A (zh) * | 2006-10-11 | 2007-09-12 | 深圳市中联创新自控系统有限公司 | 多ip通讯方法及系统 |
CN102263651A (zh) * | 2010-05-28 | 2011-11-30 | 烽火通信科技股份有限公司 | Snmp网络管理系统中局端设备连接状态的检测方法 |
US20120240119A1 (en) * | 2009-12-07 | 2012-09-20 | Zte Corporation | Method and device for file transfer protocol deadlock detection and self recovery |
CN103326771A (zh) * | 2012-03-23 | 2013-09-25 | 京信通信系统(中国)有限公司 | Rru光纤链路管理方法、装置及射频拉远单元系统 |
CN104243481A (zh) * | 2014-09-24 | 2014-12-24 | 国家电网公司 | 一种用电信息采集前置数据处理的方法及系统 |
CN104852894A (zh) * | 2014-12-10 | 2015-08-19 | 北京奇虎科技有限公司 | 一种无线报文侦听检测方法、系统及中控服务器 |
CN105490985A (zh) * | 2014-09-15 | 2016-04-13 | 腾讯科技(深圳)有限公司 | 一种基于信令传输的tcp长连接的实现方法及装置 |
-
2016
- 2016-08-05 CN CN201610635890.2A patent/CN106254179B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101035121A (zh) * | 2006-10-11 | 2007-09-12 | 深圳市中联创新自控系统有限公司 | 多ip通讯方法及系统 |
US20120240119A1 (en) * | 2009-12-07 | 2012-09-20 | Zte Corporation | Method and device for file transfer protocol deadlock detection and self recovery |
CN102263651A (zh) * | 2010-05-28 | 2011-11-30 | 烽火通信科技股份有限公司 | Snmp网络管理系统中局端设备连接状态的检测方法 |
CN103326771A (zh) * | 2012-03-23 | 2013-09-25 | 京信通信系统(中国)有限公司 | Rru光纤链路管理方法、装置及射频拉远单元系统 |
CN105490985A (zh) * | 2014-09-15 | 2016-04-13 | 腾讯科技(深圳)有限公司 | 一种基于信令传输的tcp长连接的实现方法及装置 |
CN104243481A (zh) * | 2014-09-24 | 2014-12-24 | 国家电网公司 | 一种用电信息采集前置数据处理的方法及系统 |
CN104852894A (zh) * | 2014-12-10 | 2015-08-19 | 北京奇虎科技有限公司 | 一种无线报文侦听检测方法、系统及中控服务器 |
Cited By (23)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106375324B (zh) * | 2016-09-08 | 2020-02-14 | 深圳先进技术研究院 | 一种基于tcp/ip通信协议的网络通信系统及方法 |
CN106506253A (zh) * | 2016-09-08 | 2017-03-15 | 深圳先进技术研究院 | 一种基于tcp/ip通信协议的在线客户端数量的统计系统及方法 |
CN106375324A (zh) * | 2016-09-08 | 2017-02-01 | 深圳先进技术研究院 | 一种基于tcp/ip通信协议的网络通信系统及方法 |
CN106506253B (zh) * | 2016-09-08 | 2020-04-14 | 深圳先进技术研究院 | 一种基于tcp/ip通信协议的在线客户端数量的统计系统及方法 |
CN108289063A (zh) * | 2017-09-11 | 2018-07-17 | 上海金融期货信息技术有限公司 | 一种低延迟通讯系统 |
CN108289063B (zh) * | 2017-09-11 | 2021-07-27 | 上海金融期货信息技术有限公司 | 一种低延迟通讯系统 |
CN107734001A (zh) * | 2017-09-25 | 2018-02-23 | 龙尚科技(上海)有限公司 | 一种基于定时异步通信机制判断通信是否断开的方法 |
CN107734001B (zh) * | 2017-09-25 | 2020-05-15 | 龙尚科技(上海)有限公司 | 一种基于定时异步通信机制判断通信是否断开的方法 |
CN108566390A (zh) * | 2018-04-09 | 2018-09-21 | 中国科学院信息工程研究所 | 一种卫星应用层安全协议的实现方法及卫星消息监听与分发服务系统 |
CN108566390B (zh) * | 2018-04-09 | 2020-03-17 | 中国科学院信息工程研究所 | 一种卫星消息监听与分发服务系统 |
CN108600029A (zh) * | 2018-05-09 | 2018-09-28 | 深圳壹账通智能科技有限公司 | 一种配置文件更新方法、装置、终端设备及存储介质 |
CN109445957A (zh) * | 2018-09-26 | 2019-03-08 | 迪瑞医疗科技股份有限公司 | 一种同步和异步通信控制方法、系统及装置 |
CN109547284A (zh) * | 2018-11-05 | 2019-03-29 | 北京长城华冠汽车科技股份有限公司 | 一种检测控制器局域网报文掉线的方法、装置和电动汽车 |
CN110011967A (zh) * | 2019-02-27 | 2019-07-12 | 新奥特(北京)视频技术有限公司 | 一种用于数据传输的方法和系统 |
CN110247844A (zh) * | 2019-05-23 | 2019-09-17 | 广州河东科技有限公司 | 一种智能家居网关实现多进程多协议的方法 |
CN113626208A (zh) * | 2020-05-08 | 2021-11-09 | 许继集团有限公司 | 一种基于nio异步线程模型的服务器通信方法 |
CN113626208B (zh) * | 2020-05-08 | 2024-05-14 | 许继集团有限公司 | 一种基于nio异步线程模型的服务器通信方法 |
CN113259432A (zh) * | 2021-05-12 | 2021-08-13 | 北京杰迈科技股份有限公司 | 一种基于tcp协议的通信方法及机器人远程控制系统 |
CN113259432B (zh) * | 2021-05-12 | 2022-07-08 | 北京杰迈科技股份有限公司 | 一种基于tcp协议的通信方法及机器人远程控制系统 |
CN113411237A (zh) * | 2021-08-18 | 2021-09-17 | 成都丰硕智能数字科技有限公司 | 一种低延迟检测终端状态的方法、存储介质及系统 |
CN115022751A (zh) * | 2022-08-04 | 2022-09-06 | 深圳市亿联无限科技有限公司 | 一种模块化的olt日志管理方法及系统 |
CN117118876A (zh) * | 2023-10-20 | 2023-11-24 | 美云智数科技有限公司 | 心跳连接检测方法、装置、电子设备及存储介质 |
CN117118876B (zh) * | 2023-10-20 | 2024-03-08 | 美云智数科技有限公司 | 心跳连接检测方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN106254179B (zh) | 2020-07-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106254179A (zh) | 一种心跳包异步控制方法及装置 | |
CN102880475B (zh) | 计算机软件系统中基于云计算的实时事件处理系统及方法 | |
CN106506253A (zh) | 一种基于tcp/ip通信协议的在线客户端数量的统计系统及方法 | |
CN105450489B (zh) | 输出优先实现最短报文的HEBus高效现场总线系统及通信方法 | |
US20180109456A1 (en) | System, method, and device for network load balance processing | |
CN105306585B (zh) | 一种多数据中心的数据同步方法 | |
CN100461708C (zh) | 告警同步方法 | |
CN105162674A (zh) | 一种物理机访问虚拟网络的方法及网卡 | |
CN109450711A (zh) | 分布式系统中主节点的选取方法、装置、系统及存储介质 | |
CN104702627B (zh) | 一种基于报文分类的同步并发通信方法及系统 | |
CN104954153A (zh) | 节点故障检测方法及装置 | |
CN102523118A (zh) | 一种局域网内多套控制计算机构成的冗余控制系统与方法 | |
CN107248978A (zh) | 一种消息监听处理方法及系统 | |
CN112235136A (zh) | 一种网络文件系统备份方法、系统、终端及存储介质 | |
CN105142235B (zh) | 空调机组的通讯方法及装置 | |
CN106375324A (zh) | 一种基于tcp/ip通信协议的网络通信系统及方法 | |
CN103152420B (zh) | 一种避免Ovirt虚拟管理平台单点失效的方法 | |
CN105490847B (zh) | 一种私有云存储系统中节点故障实时检测及处理方法 | |
CN108650337B (zh) | 一种服务器探测方法、系统及存储介质 | |
CN105939293A (zh) | 一种skb回收方法及装置 | |
CN106464541B (zh) | 基于网络功能虚拟化的故障处理方法及设备 | |
CN101951327B (zh) | 一种iSCSI网络系统以及检测网络故障的方法 | |
US8244891B2 (en) | Simulating a large number of users | |
CN104660728A (zh) | 基于智能家居控制系统的nat穿透方法 | |
CN105207825A (zh) | 一种网元快速同步系统及网元快速同步方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |