如何解释Socket中的保活机制和踢出用户机制?

王思明 2015-05-25 09:32:42


1.首先TCP是长连接,连接后正常情况下是不会无故断开的,但是由于路由,以及防火墙等原因的存在,会踢出长时间没有数据交换的连接,所以要有一个保活机制,发送心跳包

或者设置

e.AcceptSocket.IOControl(IOControlCode.KeepAliveValues, _keepAliveOptions, null);

2.

a.在连接没有关闭的情况下客户端异常退出,服务端还要维持这样一个连接就比较浪费,所以要踢出;

b.踢出几分钟内没有交互的连接


问题:如何去理解这两种关系??
...全文
368 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
王思明 2015-05-25
  • 打赏
  • 举报
回复
谢谢5楼! 赞过
於黾 2015-05-25
  • 打赏
  • 举报
回复
引用 3 楼 maanshan1 的回复:
[quote=引用 2 楼 Z65443344 的回复:] 如果你的客户端本来就是主动请求数据(拉取,而非推送),客户端响应请求 那么完全不用管1是怎么样的
我在代码里面看到2种情况的代码并存[/quote] 并存也好理解 服务器要主动推送,所以要保活 但是推送用的端口很可能跟拉取的端口并不是同一个端口. 也就是每个客户端与服务端建立2个连接,一个推送,一个拉取(双工) 而且即使不推送,保活的同时判断时间踢出也有一定意义,比如踢出时间受服务端控制,可以设置,而不受底层路由器的影响
Forty2 2015-05-25
  • 打赏
  • 举报
回复
1、 防火墙一般允许墙内主动向墙外发起连接,比如 10.10.10.10.1:1234 => 20.20.20.20:80 为了让返回的数据能够通过防火墙到达墙内, 防火墙要记住外出请求,并在一定时间内,允许20.20.20.20:80 =〉10.10.10.10.1:1234的内进数据通过。 因此,如果长时间内没有墙内到墙外的数据流量,防火墙可能就不再允许由外往内的数据。 也就是墙外服务器的通知,可能就会被来防火墙阻断。 而IOControlCode.KeepAlive就是让Socket定时的传输一个TCP包。 该包没有用户数据,但对防火墙可以看到该TCP数据,以便重置空闲时间,保持对内进数据的开放。 2、 如果有了’保活机制‘,那么对服务器来说,长时间没有客户的数据(包括KeepAlive包),就可以认定客户断线了。 也就是说,’保活机制‘可以用来侦测’断线‘。
王思明 2015-05-25
  • 打赏
  • 举报
回复
业务逻辑里面的确有 服务端向客户端主动发送数据的情况;
王思明 2015-05-25
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
如果你的客户端本来就是主动请求数据(拉取,而非推送),客户端响应请求 那么完全不用管1是怎么样的
我在代码里面看到2种情况的代码并存
於黾 2015-05-25
  • 打赏
  • 举报
回复
如果你的客户端本来就是主动请求数据(拉取,而非推送),客户端响应请求 那么完全不用管1是怎么样的
於黾 2015-05-25
  • 打赏
  • 举报
回复
正常都应该按2的规则来办事 但是有特殊情况,需要服务器不停推送数据,而客户端几乎不发送数据给服务端 但是客户端长时间不发送数据又会自动断开,导致推送失败,所以不得已加个心跳让客户端不要断开连接
王思明 2015-05-25
  • 打赏
  • 举报
回复
http://m.blog.csdn.net/blog/kkkkkxiaofei_11109/12966407

110,538

社区成员

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

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

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