Socket 网络断开

MasterLuo 2012-02-21 07:49:32
在维护一个网络通信程序,用是的阻塞模式。
当客户连上服务器后,把客户的网络断开(物理断网),客户一直显示连接上服务器,服务器也一直显示客户端在线。
这是因为客户连上后一直在等待服务器端发过来数据receive阻塞了,有没有办法就是让他receive来不接收数据了呢?
就是在一段时间后没收到数据就报一个异常?

我想通过另一个线程来检测如果上一次接收数据与现在超过1分钟就将Socket关闭,但是receive还是没有退出或抛出异常。因为现在所的功能都用一个socket,没法改成异步模式。

有其余解决办法?
...全文
190 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nonocast 2012-02-22
  • 打赏
  • 举报
回复
你理解的socket模型不够正确
socket设计的基础是假定不知道当前状态,事实上也不可能立即(immediately)随时知道是否连接
所以设计者考虑在read/write时抛出异常来反映给client,除非主动断开连接会有握手
那你要根据这个概念去写,
就是在write时catch断开的异常,其次如果需要知道大概的连接状态,则是定时由client向server发送心跳包来维护当前状态。

May it helps.
只在此山中 2012-02-22
  • 打赏
  • 举报
回复
可以通过发tcp检测包来判断线路是否断开,节省资源.
或参考:
int iConn = 0;
if (state1.sck1 != null)
{
if (state1.sck1.Connected)
{
if (state1.sck1.Poll(500, SelectMode.SelectRead))
{
iConn = state1.sck1.Receive(state1.acBuff);
if (iConn == 0)
{
//socket连接已断开
}
}
else
{
iConn = 1; //连接
}
}
}
nonocast 2012-02-22
  • 打赏
  • 举报
回复
只有在Read/Receive时才会触发检查物理链路,否则无视物理链路
所以通过发送心跳包定时检测物理链路的连通性
stonespace 2012-02-22
  • 打赏
  • 举报
回复
用另一个线程定时向服务器发送数据,如果物理断开就会出现异常,
窗户纸 2012-02-21
  • 打赏
  • 举报
回复
我使用过socket的阻塞模式,断网后直接就可捕获到异常的,没遇到你的现象,你看看是否是socket.blocking =true吧。(我很久前有印象说有时不设blocking,它会变成false,因此要在send/receive前手工加上强制下,具体情况已记不得了)
  • 打赏
  • 举报
回复
[Quote=引用楼主 masterluo 的回复:]
我想通过另一个线程来检测如果上一次接收数据与现在超过1分钟就将Socket关闭,但是receive还是没有退出或抛出异常。因为现在所的功能都用一个socket,没法改成异步模式。
[/Quote]

这里,你有两个无厘头莫名其妙的陈述。这两个断言太过草率。
  • 打赏
  • 举报
回复
你怎样阻塞?

这个你都不说,实在是不知道该回复你什么。
sofant 2012-02-21
  • 打赏
  • 举报
回复
发送心跳包来检测

110,533

社区成员

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

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

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