public PingPong(SocketIOSocket sio) { m_sio = sio; sio.On("pong", e => { v_thPong = true; v_thPinging = false; }); int reconnectDelay = 5; float pingInterval = 25f; float pingTimeout = 60f; int timeoutMilis = (int)Math.Floor(pingTimeout * 1000); int intervalMilis = (int)Math.Floor(pingInterval * 1000); Start(() => { if (!m_sio.wsConnected) { Thread.Sleep(reconnectDelay); } else { v_thPinging = true; v_thPong = false; m_sio.EmitPacket(new Packet(EnginePacketType.PING)); var pingStart = DateTime.Now; // Pongを待つ while (m_sio.wsConnected && v_thPinging && (DateTime.Now - pingStart).TotalSeconds < timeoutMilis) { Thread.Sleep(200); } // Pongが来なかった if (!v_thPong) { Warning("ping timeout. disconnect"); m_sio.Disconnect(); } Thread.Sleep(intervalMilis); } }); }