关于pingNotResponseCount

fdream

我的应用场景需要长时间维护不小量的连接,并且需要对client的非正常断线做出正确的反应。
查资料得知TCP协议在发送信息后,对方会回复一个收到,我的抓包结果也印证了这一点。于是想利用这一点维护pingNotResponseCount,所以client在收到ping后没有额外回复任何信息。我一直没搞清楚TCP协议中的那个“收到讯息”应该怎样获得,猜测是fwrite的返回值。但是在实际应用时,发现在TcpConnection.php的send()中,fwrite的返回值与client是否在线没什么关系。client明明已经非正常断开,send()发送ping时的返回值始终是true(也就是说fwrite的返回值始终与$send_buffer的长度相等)。
现在我想请教一下,如何在client不主动回复server发来的ping消息,而且不主动发送ping消息给server的情况下,正常的维护pingNotResponseCount?换句话说,如何获取client对于收到的包的自动回复?
对于socket只理解了皮毛,描述不清楚的地方还请大家多多包容。
我的workerman版本是3.1.4;php版本是手动编译的5.6.7,能开的选项都开了;服务器是CentOS 7.0 64位

阅读 1933
2个回答

fdream

时间太晚了嘛...

  • 暂无评论
walkor

查资料得知TCP协议在发送信息后,对方会回复一个收到,我的抓包结果也印证了这一点。

这个是tcp层面的ack包,是系统内核控制的,对于应用层是透明的,也就是说应用层无法感知到这个ack。

fwrite的返回值与client是否在线没什么关系。client明明已经非正常断开,send()发送ping时的返回值始终是true

应用层通过socket接口发送数据给对端,只要数据写到本地socket缓冲区就返回发送成功,而缓冲区的数据何时发送给对端是由操作系统内核控制的,并且受网络环境以及对端接收速度影响。如果对端突然断电或者网络切断等极端情况客户端是来不及发送fin包给服务端,服务端也就无法立刻得知连接已经断开。这种情况需要应用层心跳来解决。

要想及时知道连接是否断开,一般都要应用层心跳来支持,客户端需要发送点数据告诉服务端它还在。

  • fdream 2015-07-22

    多谢大神回答,原来是这样的,涨姿势了。那请问系统内核有关socket的设置要如何修改?如果得知本地缓冲区的占用情况呢?