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; } }

|