C#中判断socket是否已断开的方法
2010-05-19 11:39
567 查看
转载自 http://www.cnblogs.com/JLL/archive/2008/07/28/203090.html
记得以前Delphi/BCB里的socket编程,要判断[连接的另一方]是否断开了,只要在ondisconnect事件里处理就行了!如今在C#中,这个问题的确还是个问题哦!
首先,Socket类的Connected属性只表示最后一次I/O操作的状态,如果这之后[连接的另一方]断开了,它还一直返回true, 除非你再通过socket来发送数据。所以通过个属性来判断是行不通的!
有人说可以用Socket.Available属性来判断,msdn中说:如果[连接的另一方]断开了,它就会抛出异常。然而,这个BUG报告(http://dam.mellis.org/2004/08/net_socket_bugs_gotchas/)却指出:msdn的说法并不完全正确,这个属性只有在少数情况下才抛出异常。所以,这一招还是行不通!
事实上,Socket.Receive()方法在[连接的另一方]断开时,它返回结果告知只读了0个字节,我们可以籍由这一点来找出答案。这个问答(http://www.dotnet247.com/247reference/msgs/36/182526.aspx)给出了好的解决方案:可以调用Socket.Poll() 方法,为该方法的第二个参数传入SelectRead 值,如果该方法返回true, 则可以再由Socket.Receive()方法的返回值来判断, 我简要的写出代码:
如果您还有更好的方法,也请告诉我, :).
记得以前Delphi/BCB里的socket编程,要判断[连接的另一方]是否断开了,只要在ondisconnect事件里处理就行了!如今在C#中,这个问题的确还是个问题哦!
首先,Socket类的Connected属性只表示最后一次I/O操作的状态,如果这之后[连接的另一方]断开了,它还一直返回true, 除非你再通过socket来发送数据。所以通过个属性来判断是行不通的!
有人说可以用Socket.Available属性来判断,msdn中说:如果[连接的另一方]断开了,它就会抛出异常。然而,这个BUG报告(http://dam.mellis.org/2004/08/net_socket_bugs_gotchas/)却指出:msdn的说法并不完全正确,这个属性只有在少数情况下才抛出异常。所以,这一招还是行不通!
事实上,Socket.Receive()方法在[连接的另一方]断开时,它返回结果告知只读了0个字节,我们可以籍由这一点来找出答案。这个问答(http://www.dotnet247.com/247reference/msgs/36/182526.aspx)给出了好的解决方案:可以调用Socket.Poll() 方法,为该方法的第二个参数传入SelectRead 值,如果该方法返回true, 则可以再由Socket.Receive()方法的返回值来判断, 我简要的写出代码:
Socket s = new Socket(..); if (s.Poll(-1, SelectMode.SelectRead)) { int nRead = s.Receive(); if (nRead == 0) { //socket连接已断开 } }
如果您还有更好的方法,也请告诉我, :).
相关文章推荐
- C#服务端判断客户端socket是否已断开的方法
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
- C#中判断socket是否已断开的方法
- C#中判断socket是否已断开的方法
- C#中判断socket是否已断开的方法
- C#中判断socket是否已断开的方法
- C#中判断socket是否已断开的方法
- C#服务端判断客户端socket是否已断开的方法
- 判断非阻塞SOCKET是否已经断开的几种方法
- C#使用Socket快速判断数据库连接是否正常的方法
- 判断socket是否已断开的方法
- 判断非阻塞SOCKET是否已经断开的几种方法
- C# 中用Socket实现判断网络是否断开的实例
- C# 中用Socket实现判断网络是否断开的实例
- 判断非阻塞SOCKET是否已经断开的几种方法
- 在C#中利用Keep-Alive处理Socket网络异常断开的方法
- [C#.Net]判断文件是否被占用的两种方法
- [C#.Net]判断文件是否被占用的两种方法
- C#判断一个图像是否是透明的GIF图的方法
- 如何判断C# webbrower页面是否加载完毕方法