不应该使用Connected属性作为Socket是否连接上的依据
2016-12-12 22:43
239 查看
最近在做一个接口,用到了Socket异步通信。
调试了3天了,一直将Socket的Connected属性作为客户端和服务器端是否连接上的依据。今天发现我错了。
下面是从一个csdn博友写的,很好。
http://blog.csdn.net/xiaobai1593/article/details/7285930
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);
如果是进行单步调试,发现:只有在Connect()方法之后为True,然后在下一步执行时,就变为了False。控制台输出的为"false"
如果是直接执行,则输出出来是"True"
按说,在单步调试的时候,刚执行过Send()操作,应该挺“最近”的了,但在输出的时候还是"false";而直接执行的时候则没问题
说明这个“最近”是很短暂的,调试的时候根本无法判断的!
结论:
Socket.Connected不能在调试时作为套接字是否连接的判断依据;而可以加入控制台输出语句来判断套接字的连接状况!
调试了3天了,一直将Socket的Connected属性作为客户端和服务器端是否连接上的依据。今天发现我错了。
下面是从一个csdn博友写的,很好。
http://blog.csdn.net/xiaobai1593/article/details/7285930
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);
如果是进行单步调试,发现:只有在Connect()方法之后为True,然后在下一步执行时,就变为了False。控制台输出的为"false"
如果是直接执行,则输出出来是"True"
按说,在单步调试的时候,刚执行过Send()操作,应该挺“最近”的了,但在输出的时候还是"false";而直接执行的时候则没问题
说明这个“最近”是很短暂的,调试的时候根本无法判断的!
结论:
Socket.Connected不能在调试时作为套接字是否连接的判断依据;而可以加入控制台输出语句来判断套接字的连接状况!
相关文章推荐
- C#使用Socket快速判断数据库连接是否正常的方法
- socket中使用心跳来检测连接是否断开
- php连接mysql是否应该使用存储过程以及优劣势和使用场景
- jdbc数据库连接管理封装工具类,不同使用属性文件配置数据库连接信息(1)
- java.net.SocketException: Broken pipe /Mysql在经过8小时不使用后会自动关闭已打开的连接
- 利用Flash作为桥梁连接WEB页面和服务器端Socket通信,达到服务器主动"推"客户端的效果
- 对于Web开发到底是否应该使用DataReader(探讨)
- PB使用WININET的FTP方式自动更新(二、判断是否可以连接)
- 学习CSS使用技巧教程(7)连接属性
- 使用泛型作为属性
- 使用properties属性文件做连接数据库的操作代码
- java中判断socket网络远端是否断开连接
- 有关是否应该使用存储过程
- 关于使用SOCKET发送数据时“目标积极积极拒绝,无法连接”错误的原因分析
- bean作为formBean中属性使用
- 使用API判断网络是否连通(InternetGetConnectedState / IsNetworkAlive)
- 在使用Tivoli Performance Viewer观察到的JMS连接工厂和连接对应的池连接属性的具体含义
- 在使用Tivoli Performance Viewer观察到的JMS连接工厂和连接对应的池连接属性的具体含义
- 在ASP.NET中连接使用ACCESS2007作为数据库
- 51FitSoft.cn智能建站是否应该使用DIV+CSS呢?