我的應用場景需要長時間維護不小量的連接,并且需要對client的非正常斷線做出正確的反應。
查資料得知TCP協議在發(fā)送信息后,對方會回復一個收到,我的抓包結果也印證了這一點。于是想利用這一點維護pingNotResponseCount,所以client在收到ping后沒有額外回復任何信息。我一直沒搞清楚TCP協議中的那個“收到訊息”應該怎樣獲得,猜測是fwrite的返回值。但是在實際應用時,發(fā)現在TcpConnection.php的send()中,fwrite的返回值與client是否在線沒什么關系。client明明已經非正常斷開,send()發(fā)送ping時的返回值始終是true(也就是說fwrite的返回值始終與$send_buffer的長度相等)。
現在我想請教一下,如何在client不主動回復server發(fā)來的ping消息,而且不主動發(fā)送ping消息給server的情況下,正常的維護pingNotResponseCount?換句話說,如何獲取client對于收到的包的自動回復?
對于socket只理解了皮毛,描述不清楚的地方還請大家多多包容。
我的workerman版本是3.1.4;php版本是手動編譯的5.6.7,能開的選項都開了;服務器是CentOS 7.0 64位
查資料得知TCP協議在發(fā)送信息后,對方會回復一個收到,我的抓包結果也印證了這一點。
這個是tcp層面的ack包,是系統內核控制的,對于應用層是透明的,也就是說應用層無法感知到這個ack。
fwrite的返回值與client是否在線沒什么關系。client明明已經非正常斷開,send()發(fā)送ping時的返回值始終是true
應用層通過socket接口發(fā)送數據給對端,只要數據寫到本地socket緩沖區(qū)就返回發(fā)送成功,而緩沖區(qū)的數據何時發(fā)送給對端是由操作系統內核控制的,并且受網絡環(huán)境以及對端接收速度影響。如果對端突然斷電或者網絡切斷等極端情況客戶端是來不及發(fā)送fin包給服務端,服務端也就無法立刻得知連接已經斷開。這種情況需要應用層心跳來解決。
要想及時知道連接是否斷開,一般都要應用層心跳來支持,客戶端需要發(fā)送點數據告訴服務端它還在。