在做socket通信时,tcp连接,客户端拔掉网线,怎么获取这个状态,告诉用户通讯断开了?就像QQ在2秒内会掉线
本想用socket.send来获取,可socket在20秒才会捕获socketexception异常,这个值有没办法改变?20秒感觉太久了……
另外朋友们有没好的办法?
本想用socket.send来获取,可socket在20秒才会捕获socketexception异常,这个值有没办法改变?20秒感觉太久了……
另外朋友们有没好的办法?
解决方案 »
- 动态创建的多个TextBox如何绑定同一个事件?
- 求助:c# 读取xml子结点
- 如何实现勾选复选框后单选框就不能用了
- 两个窗体之间的值传递问题
- C# this.Hide()怎么使用
- 关于类库问题?
- 关于定时器的一个奇怪的问题。
- [高手请进,看看这段代码有没有后遗症]将Winform添加到Panel里!
- (WinFrm)GridView的DataGridViewTextBoxColumn 列的右边中添加一个Button 不是DataGridViewButtonColumn列 大家指点一下
- Winform 和COM 接口的线程问题
- 高手帮我看看这个winform中空间名的引用错误出在哪里?
- 关于wince程序打包发布到真机上的操作
这时,只需要捕获异常就好了。
return;//你要做的事儿
你捕获异常
这个对的,如果不采用心跳包来检测的话,只有在再使用这个socket发数据时才能抛出异常,发现网线断开
我是在做客户端,也就是说自己的网络断开,拔掉网线只是1种情况,用这个方法可以吗?
我刚才做测试,程序不能运行了,说set什么没返回
等待ing……
你捕获异常
{
if (e.ErrorCode == 10054)
{
远程主机强迫关闭了一个现有连接
}
}
DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue);
public bool IsInternetConnected()
{
int i = 0; return InternetGetConnectedState(out i, 0);
}
用ping
如果在服务端ping,会涉及防火墙问题
所以这个问题,最正规的做法就是客户端定期发送心跳包,服务端轮询检查 超时的释放socket连接
由于在应用层进行判断存在各种困难,那么是否可以考虑使用TCP底层的一些特性呢?通过思考,我想到可以利用TCP底层协议的KeepAlive-Timer进行网络状态的判断过利用Socket类的IOControl()函数可以达到上述的目的:在C#中,其语法为:
public int IOControl ( IOControlCode ioControlCode, byte[] optionInValue, byte[] optionOutValue )
其中主要参数的意义如下:
ioControlCode :一个 IOControlCode 值,它指定要执行的低级操作模式的控制代码。
optionInValue :Byte 类型的数组,包含操作要求的输入数据。 将IOControlCode的值设置为KeepAlive就可以得到对该操作的控制。对于inOptionValues的定义,可以通过查找Wsocket2的文档找到答案:它是一个如下的结构体:
Struct tcp_keepalive
{
u_long onoff; //是否启用Keep-Alive
u_long keepalivetime; //多长时间后开始第一次探测(单位:毫秒)
u_long keepaliveinterval; //探测时间间隔(单位:毫秒)
}在C#中,将一个tcp_keepalive结构的内容按照顺序写入Byte数组中,然后传递给IOControl函数,我们就可以使用该函数来对网络状态进行准确的判断了。可感觉还是不是很懂,有没大侠讲讲??