Socket.IOの切断検知はドキュメントと実装が違う
Socket.IOのオプションに渡せるpingTimeoutとpingIntervalオプションについて調べた socket.ioの切断検知の仕組み
1. clientがpingInterval (msec)毎にpingを送信する
2. serverはすぐpongを返す
このpongが一定時間以内に返ってこなかったら
clientは自分がserverから切断されたと見なす
socket.on('disconnect', callback)が発火する
この一定時間のpong待ち時間はpingTimeoutだと思ったが、実際はpingTimeout + pingIntervalだった。
pingTimeoutはタイムアウトではない
code:server.js
const options = {
serveClient: false,
pingTimeout: 60000,
pingInterval: 25000
}
const io = SocketIO(httpServer, options)
ドキュメントによると
pingTimeout (Number): how many ms without a pong packet to consider the connection closed (60000)
pingInterval (Number): how many ms before sending a new ping packet (25000)
clientがserverにping送って、serverが60秒以内にpongを返さなかったら切断、と判定するように読める
しかし実際の挙動は違う
正しくは、ping送ってpongが85秒返ってこなかったら切断と判定している
code:lib/socket.js
Socket.prototype.setPingTimeout = function () {
var self = this;
clearTimeout(self.pingTimeoutTimer);
self.pingTimeoutTimer = setTimeout(function () {
self.onClose('ping timeout');
}, self.server.pingInterval + self.server.pingTimeout);
};
pingIntervalとpingTimeoutを足した時間だけ待つようになっている
ログを見る
ブラウザの開発コンソールでwindow.localStorage.debug = 'engine*'してリロードするとログが見れる
25秒毎にpingが送られている事がわかる
https://gyazo.com/10e9a8ae3d02b5d67dffbee91799e99d
60秒以内にpongが返ってくる事を期待しているが、実際のタイムアウトは85秒