Code Bye

C# 编写TCP应用程序实时检测是否断开的问题

我使用C#的TcpClient类、TcpListening类编写了TCP通信程序,现在出现的问题是当服务器断开连接时,客户端怎么知道服务器已关闭了连接,或客户端断开连接,服务器知道客户端断开了,也就是能实时检测另外一端是否断开了连接。网上资料说采用发送非阻止、零字节的 Send 调用,但怎么实现?个人觉得这也不能实时检测得到另一端断开了。。。小白一枚,求指点!


3分
所谓”实时”,没有绝对意义上的实时,只是相对的
难道数据通信不需要时间?
而且时间精确到毫秒也根本没有任何意义

3分
对于非外在因素的断开,是可以实时知道的,那就是在连接上保持一个接收操作,当接收到0字节时即为断开连接.
如果是因物理线路原因断开是无效的,这个需要发送心跳包看有无回复,无回复则为断开.

3分
有个IsConnected属性是上一次发送或接收时的状态
MSDN说了是尝试发送零字节的数据,成功了就是还连着
try
{
socekt.Send(new byte[0]);
return true;
}
catch( SocketError exp){
{
return false;
}

另外,Select方法可以判断多种状态, http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.select.aspx

这是是我说的有问题,我就是想当一段断开后,另一端能知道已经断开了。。。

3分
public void receivemessage()
        {    
            while (true)
            {
                string receiveStr = null;
                try
                {
                    receiveStr = br.ReadString();//会卡在这,只有接受到东西才会执行下一次循环
                }
                catch{}
                if (receiveStr == null)
                {
                    richTextBox1.Text += "与客户端断开连接....\n";
                    break;
                }
            }
        }

2分
可以使用心跳包检测,.Net中的Socket提供了这样的功能

1分
catch{}
if (receiveStr == null)
{
richTextBox1.Text += “与客户端断开连接….\n”;
break;
}
你都不判别异常类型就知道?你怎么知道不是ReceiveTimeout时间到了,而此时发送方并未断开连接

2分
做一个心跳包线程,如果服务器端不能返回数据,或者异常 说明断了
所谓心跳包  就是发送数据 (只不过这个数据很小 自定义)

1分
引用 7 楼 dongxinxi 的回复:

catch{}
if (receiveStr == null)
{
richTextBox1.Text += “与客户端断开连接….\n”;
break;
}
你都不判别异常类型就知道?你怎么知道不是ReceiveTimeout时间到了,而此时发送方并未断开连接

无所谓了,我是随便找来的一段代码,看懂了必然会考虑异常


2分
这个问题基本是使用心跳包解决,但没有绝对的实时。
多谢各位的解答,开始入门了!

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 编写TCP应用程序实时检测是否断开的问题