记一次解决C#socket异步通讯内存持续增加的问题

现象

发现在客户端不断重复连接、发送、接受、关闭的过程,然后持续一天运行后,内存是在不断增加的,虽然增加的速度不快,一天下来,大概有20M增加到130M。但是由于项目会需要长时间运行(数月不关),所以肯定是不行的。

查找过程

首先在网上看到了socket有非托管资源,需要手动调用Dispose清除。然后在接收数据的回调函数中检测断联就将该套接字Dispose。发现还是无用。使用VS的内存快照看到的对象也基本是托管的,但找不到哪里引用的。之后还用了WinDbg查看,也找不到是为什么。然后还将能重复使用的对象都改成只new一次,仍然不能解决。之后用网口助手测试,发现基本是不是收发数据造成的内存泄露,而是客户端不断关闭,重连造成的。问题的位置就基本找到了。

解决办法

发现在接受数据回调函数里面判断客户端断连后要再异步调用一次服务器监听,测试一下将它屏蔽后就发现内存不再一直增长。看来原因就是这个。更深层的原因是什么,可能是跟异步监听回调函数里面有异步监听,而接受函数也有异步监听,二者重复造成冲突了吧

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在VS2019中使用C#进行Socket异步通信的步骤如下: 1. 创建一个新的C#控制台应用程序项目。 2. 在项目中添加一个新的类文件,用于处理Socket通信的逻辑。 3. 在类文件中引入System.Net.Sockets命名空间,以便使用Socket相关的类和方法。 4. 创建一个Socket对象,并设置其属性和参数,如IP地址、端口号、协议类型等。 5. 使用Socket对象的BeginConnect方法发起异步连接请求,传入服务器的IP地址和端口号作为参数。 6. 创建一个回调函数,用于处理连接请求的结果。回调函数的参数是IAsyncResult类型,可以通过它获取连接状态和错误信息。 7. 在回调函数中,使用EndConnect方法结束异步连接请求,并检查连接是否成功建立。 8. 如果连接成功建立,可以开始进行数据的发送和接收操作。 9. 使用Socket对象的BeginSend和BeginReceive方法发起异步发送和接收请求,传入要发送或接收的数据作为参数。 10. 创建两个回调函数,分别用于处理发送和接收操作的结果。回调函数的参数是IAsyncResult类型,可以通过它获取发送或接收的状态和错误信息。 11. 在发送和接收的回调函数中,使用EndSend和EndReceive方法结束异步发送和接收请求,并处理发送或接收到的数据。 12. 可以根据需要重复执行步骤9到11,实现连续的数据发送和接收。 13. 当不再需要进行通信时,使用Socket对象的Close方法关闭Socket连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值