Socket和TcpClient怎样才能知道跟对方断开了没有?(高分)

tanta 2005-08-20 01:39:32
================================================================
MSDN上说:Socket如果远程主机处于关机状态或关闭了连接,则 Available 将引发 SocketException。
我采用如下代码检测,对方程序都关闭了,也没有发生异常。为什么?

在Timer组件中检测(Socket tcp)
label3.Text=tcp.Available.ToString();
始终没有异常发生
======================================================
MSDN上说:如果远程主机关机或关闭连接,则 DataAvailable 将引发 SocketException。

TcpClient+NetWorkSteam(NetworkSteam ns)
用ns.DataAvailable 也检测不到任何异常。即便是对方连接的程序都关闭了。
============================================================
大家检测网络断开有什么好的办法?
...全文
1037 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fakeer 2005-11-24
  • 打赏
  • 举报
回复
在TcpClient或socket已经建立连接后,甚至在Receive或Send数据时,远程的客户端如果己经关闭了连接,程序都不报错,如何才能知道客户端己经关闭了连接啊,偶也很想知道啊!

Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
tcpListener = New TcpListener(IPAddress.Any, txtListenPort.Text)
tcpListener.Start()

thrListen = New Threading.Thread(AddressOf ListenService)
thrServer = New Threading.Thread(AddressOf ReceiveService)
thrListen.Start()
thrServer.Start()

txtOutput.Text = "Server start ..."
End Sub


Private Sub ReceiveService()
Dim netStream As NetworkStream
Dim intRead As Integer

While True
If Not socServer Is Nothing Then
Do
Try
Dim bytData(1024) As Byte
'这里无论socket是否Blocking,当客户端连接关闭时都不知道,也无异常
intRead = socket.Receive(bytData, bytData.Length, SocketFlags.None)
txtOutput.Text = txtOutput.Text & ControlChars.CrLf & codEncoding.GetString(bytData)
Catch es As SocketException
Exit Do
End Try
Loop While intRead > 0
End If
System.Threading.Thread.Sleep(200)
End While
End Sub
tanta 2005-08-25
  • 打赏
  • 举报
回复
问题就是不报任何错误,有错误就好办了......
navy_koo 2005-08-24
  • 打赏
  • 举报
回复
对,你要检查接受的消息;如果连接断了,读消息后回出错的。
yinshuhai 2005-08-24
  • 打赏
  • 举报
回复
对方在断开一个已经连接上的socket的时候,本机的socket连接会报异常消息为“远程主机已经断开连接”(好像是这样的)你可以单步调试下,截获这个异常就知道对方断开连接了。
tanta 2005-08-24
  • 打赏
  • 举报
回复
真的没高手了吗?这可是网络程序中经常用到的啊......
ewaguruhz 2005-08-23
  • 打赏
  • 举报
回复
检查tcpclient的active属性
举例说明
[C#]
// This derived class demonstrates the use of three protected methods belonging to the TcpClient class
public class MyTcpClientDerivedClass : TcpClient
{

// Constructor for the derived class.
public MyTcpClientDerivedClass() : base()
{
}
public void UsingProtectedMethods()
{

// Uses the protected 'Active' property belonging to the TcpClient base class
// to determine if a connection is established.
if (this.Active){
// Calls the protected 'Client' property belonging to the TcpClient base class.
Socket s = this.Client;
// Uses the Socket returned by Client to set an option that is not available using TcpClient.
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
}
// To free all resources, calls the protected virtual method Dispose belonging to the TcpClient base class.
this.Dispose(true);
GC.SuppressFinalize(this);

}

}
tanta 2005-08-23
  • 打赏
  • 举报
回复
感谢 ewaguruhz(黄桢)和dreamchild(梦小孩)
可是:
TcpClient 的派生类可使用此属性(active)来确定连接尝试是否已成功。此属性不监视 TcpClient 连接的当前状态。如果远程主机关闭连接,将不更新 Active。
可使用 Connected 属性来获取 Socket 的连接状态。此属性将返回 Socket 的最新已知状态。当它返回 false 时,表明 Socket 要么从未连接,要么已断开连接。即使 Connected 返回 true,也无法保证 Socket 仍处于 Connected 状态。true 值仅意味着在上次 I/O 操作时 Socket 处于连接状态。

================================================================================
我希望当我的客户端关闭后,我的服务器端能马上知道。并且不能指望客户端在关闭前给发关闭指令。


钛元素 2005-08-23
  • 打赏
  • 举报
回复
active是不行的!
一定要用socket的connected
dreamchild 2005-08-23
  • 打赏
  • 举报
回复
connected 属性不就好了吗?返回true 或false
sarcophile 2005-08-23
  • 打赏
  • 举报
回复
没什么好办法,只能Ping, dot net 2.0甚至提供了这样一个函数。

远程主机“关机”是指正常退出操作系统,或关闭连接,这两种情况下TCP会发送一贞结束标志,本机就可以检测到,如果正在读写,就会引发异常。

但如果结束标志来不及发出,比如远程主机断电,本机肯定无法知道的,这时只有发一个数据包,看远程主机是否有应答
tanta 2005-08-20
  • 打赏
  • 举报
回复
只有发送信息的时候客户端才抛出异常,并没有达到服务器断开客户端就抛出异常的效果……………
感谢 fancyf(凡瑞) 的回答,不过,还是没有解决问题啊.希望大家踊跃发言...
fanruinet 2005-08-20
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/TopicView.asp?id=3638505
tanta 2005-08-20
  • 打赏
  • 举报
回复
也就是说,我采用Socket或TcpClient建立了连接,怎么来检测对方是否关闭了连接?
tanta 2005-08-20
  • 打赏
  • 举报
回复
也就是说,我采用Socket或TcpClient建立了连接,怎么来检测对方是否关闭了连接?

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧