通信算法问题?来者有分,高手请进!
不好意思,又重提老问题。通信代码是点对多型服务器端和客户端,服务器端的发送线程从发送数据链表中取头元素后,把它发送到所有连接了服务器的客户端。采用两个线程,一个发送线程和一个主线程(接受函数在里面)。因本系统是电力系统的采集系统,所以服务器总是有实时数据传入,即发送线程总是工作的。为了在LAN保障数据的可靠通信,采用一个简单的校验,到客户端收到数据校验后,再向服务器发送一个信息(决定是否需重发),服务器再根据此信息来维护发送数据链表和发送数据备份链表。
我现在采取的算法是:客户端端收到某一数据包后,向服务器发送一个信息(‘N’+该数据包的流水号)当服务器第一次收到某一个特定的信息头后(如“N”),把它后面的流水号赋给一个全局变量,再把下次收到的改类型的流水号与第一个比较,相等就把计数变量加1,当计数变量等于了客户连接链路的元素后,则从数据发送链表中删除此元素,以及相应的发送数据备份链表中的元素。
上面的算法目前还是有点问题:对于某个数据包,如果客户端只有部分或没有根本没有返回信息,则服务端不能删除发送数据链表中的元素,这样这个元素占有的内存就永远不能释放,因此发生多次这样的问题,系统资源将受到影响。请问大家怎样改进这个算法?
运行状态:
如果是一个客户端与服务器连接时,服务器端能够处理过来,代码占有的内存数为4,476K,但当再加入一个客户端,代码占有服务器的内存会不端的增大,运行几个小时,就会把内存耗完。目前我估计主要是由于上述算法而致,因为代码内存泄漏方面自己用了BoundsChecker没有检测到内存泄漏的错误,另外我的发送数据链表内容没有用到指针。
问题:请问大家怎样改进这个算法?谢谢!