以下内容摘自微软的页面:http://technet.microsoft.com/zh-cn/magazine/system.net.sockets.socket.connected(VS.90).aspx
Connected 属性获取截止到最后的 I/O 操作时 Socket 的连接状态。当它返回 false 时,表明 Socket要么从未连接,要么已断开连接。
Connected 属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。
如果调用用户数据报协议 (UDP) 套接字上的 Connect,则 Connected 属性始终返回 true;不过,此操作不更改 UDP 的内在无连接特性。
C#测试代码如下:
// .Connect throws an exception if unsuccessful client.Connect(anEndPoint); // This is how you can determine whether a socket is still connected. bool blockingState = client.Blocking; try { byte [] tmp = new byte[1]; client.Blocking = false; client.Send(tmp, 0, 0); Console.WriteLine("Connected!"); } catch (SocketException e) { // 10035 == WSAEWOULDBLOCK if (e.NativeErrorCode.Equals(10035)) Console.WriteLine("Still Connected, but the Send would block"); else { Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode); } } finally { client.Blocking = blockingState; } Console.WriteLine("Connected: {0}", client.Connected);
个人理解:
刚开始对所谓的“反映最近操作时的连接状态”不太理解,为什么是最近操作的?
这个概念很模糊,最近到什么程度?
后来编写了如下代码进行调试:(客户端)
try { Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); string srvIP = "127.0.0.1"; int srvPort = 2030; clientSock.Connect(srvIP, srvPort); string msg="hello, this is a message from client"; Byte[] sendBuf=Encoding.ASCII.GetBytes(msg); clientSock.Send(sendBuf); Console.WriteLine(clientSock.Connected.ToString()); } catch (SocketException e) { Console.WriteLine(e.Message); }
说明:在调试和执行过程中,客户端发送消息无误,与服务器连接没有问题
如果是进行单步调试,发现:只有在Connect()方法之后为True,然后在下一步执行时,就变为了False。控制台输出的为"false"
如果是直接执行,则输出出来是"True"
按说,在单步调试的时候,刚执行过Send()操作,应该挺“最近”的了,但在输出的时候还是"false";而直接执行的时候则没问题
说明这个“最近”是很短暂的,调试的时候根本无法判断的!
结论:
Socket.Connected不能在调试时作为套接字是否连接的判断依据;而可以加入控制台输出语句来判断套接字的连接状况!