Luyan

追求,探索,研究,创新...
随笔 - 58, 评论 - 663, 引用 - 54

导航

关于


标签

每月存档

最新留言

广告

 

Socket类的Connected属性往往不能精确的判断出网络是否连接,下面这段代码可以解决这个问题

/// <summary>
/// 是否已经连接
/// </summary>
public virtual bool Connected
{
 get
 {
  try
  {
   //检查socket的状态是否可读
   if(m_socket.Connected && m_socket.Poll(0, SelectMode.SelectRead))
   {
    byte[] aByte = new byte[1];
    //因为TCP/IP协议无法精确的判断网络是否可用
    //试读一个字符,Peek参数指定读取的字符不会从缓冲区中移除
    //假如可读则表示连接可用
    if(m_socket.Receive(aByte, 0, 1, SocketFlags.Peek) != 0)
     return true;
    Close("Disconnected.");
    return false;
   }
  }
  catch(SocketException e)
  {
   OnException(e);
  }
  return m_socket.Connected;
 }
}

打印 | 张贴于 2004-10-04 00:50:00 | Tag:暂无标签

留言反馈

#回复: 精确的判断网络是否可用 编辑
你好,你真的很不错,但是我.........你能加这个QQ吗: 735978202谢谢!
2007-12-23 11:07:00 | [匿名:闯闯]
#re: 精确的判断网络是否可用 编辑
一样
2006-08-19 23:23:00 | [匿名:影视制作,宣传片制作,影视广告制作]
#re: 精确的判断网络是否可用 编辑
怎么不写完整啊??
我想用这段代码都用不成了
2006-06-26 19:44:00 | [匿名:guaile]
#re: 精确的判断网络是否可用 编辑
好象不起作用,我又加上了对Socket.Available判断。
谁有好的办法?
2005-12-22 15:40:00 | [匿名:Jeff]
#re: 精确的判断网络是否可用 编辑
这种判断还是很有效的
2005-07-12 17:06:00 | [匿名:shajisky]
#re: 精确的判断网络是否可用 编辑
上面的代码没有作用。
(同步模式)


服务端口 ------ 监听
客户 --连接
客户 --发数据
客户 --断开
服务端口 -- clientsocket = server.Accept()

这时候的 clientsocket 仍然可以收数据, 发数据就有问题了。

2005-06-23 16:58:00 | [匿名:周宝熊]
#re: 精确的判断网络是否可用 编辑
可以利用winnet中提供的InternetGetConnectedState函数.
如果是C#的话:
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState( out int connectionDescription, int reservedValue ) ;
2005-06-21 18:13:00 | [匿名:cracer]
#re:精确的判断网络是否可用 编辑
精确的判断网络是否可用ooeess
2005-06-10 17:13:00 | [匿名:NAVITAR]
#re:精确的判断网络是否可用 编辑
^_~,pretty good!csharpsseeoo
2005-05-16 14:55:00 | [匿名:绝缘电阻测试仪]
#re:精确的判断网络是否可用 编辑
^_^,Pretty Good!
2005-04-16 01:22:00 | [匿名:智能后备操作器]
#re:精确的判断网络是否可用 编辑
^_^,Pretty Good!
2005-04-10 19:55:00 | [匿名:高度尺]
#re: 精确的判断网络是否可用 编辑
小子,努力吧。。。。
2004-12-14 16:08:00 | [匿名:z]
#re: 精确的判断网络是否可用 编辑
不能复制来用,那么多的错误
2004-11-23 14:51:00 | [匿名:z]
#re: 精确的判断网络是否可用 编辑
同意race 的观点,如果没有数据可读,那么下面的
m_socket.Receive(aByte, 0, 1, SocketFlags.Peek) != 0

就可能阻塞了.
2004-10-11 10:00:00 | [匿名:Xpc]
#re: 精确的判断网络是否可用 编辑
这可能是有问题的,请参考TCP的保活模型。
2004-10-08 18:11:00 | [匿名:cc]
#re: 精确的判断网络是否可用 编辑
“不过为什么Socket的设计者还是要提供Connected?”

我觉得这是在抬杠了

另外这个方法中,如果连接是正常的,但是缓冲区中本来就没有需要读的内容,那么测试的结果。。。不是失败么?
2004-10-06 20:46:00 | [匿名:race]
#re: 精确的判断网络是否可用 编辑
hi

到底为什么要提供Connected可不知道,

如果只是单纯的猜测......请指正。

从外部来看,如果已经出现过一次错误就没有必要再去执行实际的操作,所以有这样的状态标志会好用一些。
例如,假设要做一个函数,函数式样要求接受一个Socket参数,那么在实装时,也许首先要做的是判断Connected状态然后工作等等。

对内部来说,我想是不是在设计者的脑海里有一个状态图,为了描述类当前状态从A迁移到了B,所以需要使用Connected这个东西。
2004-10-04 15:03:00 | [匿名:Yu]
#re: 精确的判断网络是否可用 编辑
同意你的意见,我想你的设计观点可能也就是Socket类库的设计者没有提供精确的Connected的原因吧
不过为什么Socket的设计者还是要提供Connected?
2004-10-04 13:37:00 | [匿名:luyan]
#re: 精确的判断网络是否可用 编辑
hi,

Socket.Connected的文档中应该有明确的定义,Connected只显示上次I/O访问是否成功。
也就是说在Socket类的内部应该只是一个布尔值吧。期待它精确是不可能。:-)

因为没有测试一下,我不知道你的代码是否可以在任何情况下都会正常工作。
不过我有些对这个方法的存在意义有点儿怀疑,请指正。

其实想精确判断的想法完全可以理解...如果我是类库设计者,我也会考虑是否要追加一个IsConnect方法来判断。可是这样有什么意义吗?即使现在可以得到精确的接续正常状态值,但是在实际使用的时候是否正常谁也无法保证。

也就是说该做的异常处理还是要做。那么我会考虑不提供类似IsConnect这样可以做精确判断的成员,另外要是误导使用者以为在确保接续的状态下可以不必做相应的异常处理更不是设计者期待的。
2004-10-04 12:56:00 | [匿名:Yu]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0