博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Socket连接 无法访问已释放的对象
阅读量:5918 次
发布时间:2019-06-19

本文共 1052 字,大约阅读时间需要 3 分钟。

在进行Socket长连接时,若服务器或客户端出现异常时,另外一端对Socket对话进行操作时,程序会出现无法访问已释放的对象的问题。例如客户端出现问题主动断开Socket时,当服务器操作Socket时,比如主动断开Socket会话,那么程序会出现“无法方位已释放的对象”,是由于客户端的原因导致服务器和客户端的Socket已经不存在或连接已经断开,即Socket已经释放,服务器再操作服务器和客户端的Socket肯定会报错,因此在服务器或客户端一侧操作Socket时,必须首先判断Socket是否存在、连接是否正常,只有存在且连接正常的Socket才允许操作。以服务器断开Socket为例:

               

//判断Socket是否存在且连接正常,存在且连接正常的Socket才运行进行断开操作                 if (_cliSock != null && _cliSock.Connected)                {                    //关闭Socket之前,首选需要把双方的Socket Shutdown掉                    _cliSock.Shutdown(SocketShutdown.Both);                    //Shutdown掉Socket后主线程停止10ms,保证Socket的Shutdown完成                    System.Threading.Thread.Sleep(10);                    //关闭客户端Socket,清理资源                    _cliSock.Close();                }

 

  注:Socket对话就相当于两个国家(A和C)通过贸易渠道进行稀土交易,正常情况下,A、C国家正常支持该贸易,贸易可以正常进行,若C国家法律禁止稀土出口,主动关闭了该贸易通道,但是A国家并不知道,那么A国家发往C国的所有贸易请求将会被丢失,对贸易通道所有的维护都将失败,所以需要在C国执行法律时(即Close())之前,需要关闭双方的贸易通道(即 SocketShutdown.Both),然后等待最后一批在贸易通道的货物成功运送至A国(即主线层休眠10ms),再执行法律,真正关闭Socket连接。

来源:http://blog.sina.com.cn/s/blog_5f4ffa17010112h7.html

转载地址:http://grfvx.baihongyu.com/

你可能感兴趣的文章
RHCE_LAB(2)SSH远程登录自动验证(不输入用户登录密码)的实现
查看>>
Linux命令之uniq
查看>>
vlan技术与单臂路由
查看>>
Java基础方面二
查看>>
Tomcat部署Web应用方法总结
查看>>
swift篇第五期:UITableView,OC与Swift互调
查看>>
我的友情链接
查看>>
【设计模式与Android】工厂方法模式——化工女神的工厂
查看>>
总结thinkphp快捷查询getBy、getField、getFieldBy用法及场景
查看>>
用 jupyter notebook 打开 oui.txt 文件出现的问题及解决方案
查看>>
Linux 常用命令
查看>>
C语言集成开发环境vs2017的使用技巧之修改快捷键
查看>>
4.1 df命令;4.2 du命令;4.3——4.4 磁盘分区
查看>>
无线路由器使用交换机模式上网不稳定
查看>>
shell脚本相关
查看>>
C# for VS foreach 性能对比
查看>>
为了博多
查看>>
iOS单例创建的一点疑惑
查看>>
正则表达式
查看>>
MyBatis之二:简单增删改查
查看>>