Bootstrap

个人总结-遇到的问题以及如何解决

本文为个人的总结,设计C#和C++知识,纯纯为了练自己的总结能力,和记录自己当时是如何去解决问题的,不感兴趣的话可以滑走啦,没有干货!有干货的话,当然也是解决问题的想法和思路啦!继续看的朋友们,那么就接着下面开始了。

1.superSocket框架

在探索C#通信框架SuperSocket时,我遇到了一个挑战:默认的1024字节接收缓冲区在处理大量数据时会导致消息丢失,这种情况虽不常见,但极难调试。为了解决这一问题,我采取了以下步骤:

  1. 问题复现:通过大量数据传输测试,我努力复现了这一偶现问题,这是解决问题的第一步。

  2. 源码分析:深入研究SuperSocket的源码,我寻找到了问题的根源——默认的接收缓冲区大小。

  3. 社区搜索:在网络社区中搜索,看是否有其他开发者遇到并解决了类似的问题。

  4. 配置调整:通过阅读源码,我发现可以通过serverConfig对象在创建服务器实例时调整默认配置。SuperSocket允许通过重载的启动函数传入自定义配置,从而解决了接收缓冲区大小的问题。

通过这些步骤,我不仅解决了问题,还加深了对SuperSocket框架的理解。在文章的结尾,我推荐读者查看SuperSocket的源码和相关使用资料,以便更深入地掌握这一强大的通信框架。

推荐资料

2.ACE Acceptor-Connector框架

Acceptor-Connector框架解除了“对端服务的连接和初始化”和“连接和初始化之后处理”的耦合

推荐文章:ACE Acceptor-Connector框架icon-default.png?t=O83Ahttps://blog.csdn.net/xiexingshishu/article/details/140560905?spm=1001.2014.3001.5501

通过策略模式(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。

什么是event_fd? 有什么用?icon-default.png?t=O83Ahttps://zhuanlan.zhihu.com/p/393748176

;