本文为个人的总结,设计C#和C++知识,纯纯为了练自己的总结能力,和记录自己当时是如何去解决问题的,不感兴趣的话可以滑走啦,没有干货!有干货的话,当然也是解决问题的想法和思路啦!继续看的朋友们,那么就接着下面开始了。
1.superSocket框架
在探索C#通信框架SuperSocket时,我遇到了一个挑战:默认的1024字节接收缓冲区在处理大量数据时会导致消息丢失,这种情况虽不常见,但极难调试。为了解决这一问题,我采取了以下步骤:
-
问题复现:通过大量数据传输测试,我努力复现了这一偶现问题,这是解决问题的第一步。
-
源码分析:深入研究SuperSocket的源码,我寻找到了问题的根源——默认的接收缓冲区大小。
-
社区搜索:在网络社区中搜索,看是否有其他开发者遇到并解决了类似的问题。
-
配置调整:通过阅读源码,我发现可以通过
serverConfig
对象在创建服务器实例时调整默认配置。SuperSocket允许通过重载的启动函数传入自定义配置,从而解决了接收缓冲区大小的问题。
通过这些步骤,我不仅解决了问题,还加深了对SuperSocket框架的理解。在文章的结尾,我推荐读者查看SuperSocket的源码和相关使用资料,以便更深入地掌握这一强大的通信框架。
推荐资料:
- SuperSocket源码:GitHub上的SuperSockethttps://github.com/kerryjiang/SuperSocket
- SuperSocket使用文档:SuperSocket官方文档http://supersocket.net/
2.ACE Acceptor-Connector框架
Acceptor-Connector框架解除了“对端服务的连接和初始化”和“连接和初始化之后处理”的耦合
通过策略模式(Strategy Pattern)提供了高度的灵活性和可配置性。例如,它们可以有不同的创建(Creation Strategy)、接受(Accept Strategy)和并发(Concurrency Strategy)策略。建议看源码学习
3.epoll事件驱动模式
说简单点,就是:主动连接处理事件、被动连接处理事件、业务处理事件。
在主动连接事件中:connect会连接服务器,将文件描述符加入到可以是一个map中,一个fd对应一个业务处理事件类,业务处理事件类中有处理读事件、写事件的方法。将文件描述符加入到epoll_ctl()中,epoll_wait会检测是否有事件发生,发生事件,找到对应的fd,通过fd拿到对应的业务处理事件类,通过类调用是否是读事件方法还是写事件方法。被动连接处理事件也是类似如此。也可以将业务事件处理类将fd绑定在,epoll_event中的ptr指针中。
4.线程回收资源防止内存泄漏
内存泄漏是应用程序中最不应该出现的情况,但是也是最难处理的部分。由于做的项目都是基于多线程的环境下,可以从以下几个方面来实现:
1.在接收数据的缓冲区中,应该考虑到因为网络阻塞或者网络滞后的情况下,会不会造成内存泄漏问题。
2.在线程while(1)无限运行的时候,代码中尽量不要出现while(1)死循环,可以用while(条件);条件可以是一个bool类型变量,在对象的析构函数中将其赋值为false。
3.Linux下检测内存泄漏的工具:Valgrind。
在线程无限次测试,是否还有内存泄漏的情况下,在调用堆栈的调试下,终于找到了。
我的线程中有epoll_wait,在没有事件发生的时候,它是一直阻塞住的,也就是析构函数将while(条件)中的条件=false;它还是阻塞住的,也就是不会跳出线程中,导致线程资源也是不能及时释放的。
解决办法:在析构函数中,使用event_fd,在唤醒阻塞住的epoll_wait。