请求CSDN朋友指点下 Socket 异步断线重连问题

kushirong 2016-09-07 06:51:20
异步函数
SocketConnected()
SocketReceived()
Send()
SocketSended()

连接建立之后开始接收数据,
客户端的连接随时可能断掉,有可能是服务器主动断开,客户端也有可能主动断开.
如果连接断开了,我应该在Send里捕获异常进行断线重连还是在received 里捕获异常进行断线重连。
如果在Send里捕获异常进行断线重连的话 那么N个线程一直在调用send 函数去发送数据,会不会触发好多次重连操作?
如果在rec里捕获异常进行断线重连会不会有一定得延时,比如socket 断开好久了N个包发送失败之后才会触发此异常?
一直没拐过来湾,还请懂的朋友慷慨解囊.
...全文
269 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kushirong 2016-09-08
  • 打赏
  • 举报
回复
多谢这位热心的仁兄,小弟突然茅塞顿开.在CSDN经常见到你. 祝工作顺利!
sp1234_maJia 2016-09-07
  • 打赏
  • 举报
回复
可能你会纠结于如果“既不send,在异步 receive 机制也不捕获异常,你所使用的底层通讯框假也没有心跳检测,tcp机制默认的心跳机制的间隔很长(可能1小时才有1次),此时如何知道断线?”的问题。 这没有办法知道断线。不用多想,不可能提前知道断线。 所以你可以设计自己的业务逻辑上的心跳机制,当很长时间(例如30秒钟)没有send 信息时,就去主动 send 一个信息(例如随便拉取一个简单状态信息),顺便定时检测是否断线。
  • 打赏
  • 举报
回复
当你断线重连,自然就会放弃之前的所有的注册的 receive 监听,而重新注册 receive 方法。那么那些“死等” receive 的任务就自动释放了。 当你在已经开始receive具体的字节时发生了错误,那么关闭当前的通道、重连。此时必定扔掉了对方发送来的数据。
  • 打赏
  • 举报
回复
引用 楼主 kushirong 的回复:
如果在rec里捕获异常进行断线重连会不会有一定得延时,比如socket 断开好久了N个包发送失败之后才会触发此异常?
你自己都说了“send如果发送失败,会重连”,那么这个话就不合逻辑了。
  • 打赏
  • 举报
回复
“连接”操作是同步的,不会多个线程并发连接。例如
lock(flag)
{
    if(!this.IsConnected)
        Connect();
}
那么就算是50个线程同时去“连接”,如果第一个已经连接成功,后边49个操作“直接成功”了,而不会去真的去连接。
kushirong 2016-09-07
  • 打赏
  • 举报
回复
PS服务端代码我不可控.
kushirong 2016-09-07
  • 打赏
  • 举报
回复
当发送数据时候连接正好断开,会不会同时触发2个异常 ,Send 与Receive.

110,566

社区成员

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

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

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