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:暂无标签

留言反馈
我想用这段代码都用不成了
谁有好的办法?
(同步模式)
服务端口 ------ 监听
客户 --连接
客户 --发数据
客户 --断开
服务端口 -- clientsocket = server.Accept()
这时候的 clientsocket 仍然可以收数据, 发数据就有问题了。
如果是C#的话:
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState( out int connectionDescription, int reservedValue ) ;
m_socket.Receive(aByte, 0, 1, SocketFlags.Peek) != 0
就可能阻塞了.
我觉得这是在抬杠了
另外这个方法中,如果连接是正常的,但是缓冲区中本来就没有需要读的内容,那么测试的结果。。。不是失败么?
到底为什么要提供Connected可不知道,
如果只是单纯的猜测......请指正。
从外部来看,如果已经出现过一次错误就没有必要再去执行实际的操作,所以有这样的状态标志会好用一些。
例如,假设要做一个函数,函数式样要求接受一个Socket参数,那么在实装时,也许首先要做的是判断Connected状态然后工作等等。
对内部来说,我想是不是在设计者的脑海里有一个状态图,为了描述类当前状态从A迁移到了B,所以需要使用Connected这个东西。
不过为什么Socket的设计者还是要提供Connected?
Socket.Connected的文档中应该有明确的定义,Connected只显示上次I/O访问是否成功。
也就是说在Socket类的内部应该只是一个布尔值吧。期待它精确是不可能。:-)
因为没有测试一下,我不知道你的代码是否可以在任何情况下都会正常工作。
不过我有些对这个方法的存在意义有点儿怀疑,请指正。
其实想精确判断的想法完全可以理解...如果我是类库设计者,我也会考虑是否要追加一个IsConnect方法来判断。可是这样有什么意义吗?即使现在可以得到精确的接续正常状态值,但是在实际使用的时候是否正常谁也无法保证。
也就是说该做的异常处理还是要做。那么我会考虑不提供类似IsConnect这样可以做精确判断的成员,另外要是误导使用者以为在确保接续的状态下可以不必做相应的异常处理更不是设计者期待的。