void SmartSocket::handleReceive(const boost::system::error_code& error, size_t recvBytes) { try { if (error == error::message_size || (!error && recvBytes < sizeof(PacketHeader))) { notifyObservers(&ISocketStateObserver::onBadPacketSize, m_recvPeer, recvBytes); } else if (error) { auto conn = getExistingConnection(m_recvPeer); if (conn && !conn->isDead()) switch (error.value()) { case error::connection_aborted: case error::connection_refused: case error::connection_reset: notifyObservers(&ISocketStateObserver::onPeerDisconnect, conn); conn->markDead(true); break; default: notifyObservers(&ISocketStateObserver::onError, conn, error); break; } } else { ConnectionPtr conn = getOrCreateConnection(m_recvPeer); conn->handleReceive(std::make_shared<Packet>(m_recvBuf.data(), recvBytes)); conn->markDead(false); } } catch (const std::exception& ex) { LogError() << ex.what(); } catch (...) { LogFatal() << "unknown exception" << cSourceLocation; } startReceive(); }