From f702a64305a448336d5c50eb19a899f5d39dd6e0 Mon Sep 17 00:00:00 2001 From: server Date: Tue, 14 Apr 2026 16:23:33 +0200 Subject: [PATCH] db: clarify peer disconnect diagnostics --- src/db/ClientManager.cpp | 30 +++++++++++++++++++----------- src/db/PeerBase.cpp | 5 ++++- src/libthecore/socket.cpp | 3 +++ 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/db/ClientManager.cpp b/src/db/ClientManager.cpp index 30c1431..4ce27a0 100644 --- a/src/db/ClientManager.cpp +++ b/src/db/ClientManager.cpp @@ -2500,7 +2500,8 @@ void CClientManager::ProcessPackets(CPeer * peer) break; default: - sys_err("Unknown header (header: %d handle: %d length: %d)", header, dwHandle, dwLength); + sys_err("Unknown header (header=%u packet_handle=%u length=%u peer_handle=%u host=%s recv=%d processed=%d)", + header, dwHandle, dwLength, peer->GetHandle(), peer->GetHost(), peer->GetRecvLength(), i); break; } } @@ -2886,18 +2887,25 @@ int CClientManager::Process() switch (fdwatch_check_event(m_fdWatcher, peer->GetFd(), idx)) { case FDW_READ: - if (peer->Recv() < 0) + switch (peer->Recv()) { - sys_err("Recv failed"); - RemovePeer(peer); - } - else - { - if (peer == m_pkAuthPeer) - if (g_log) - sys_log(0, "AUTH_PEER_READ: size %d", peer->GetRecvLength()); + case -2: + sys_log(0, "Peer disconnected cleanly. (host=%s peer_handle=%u fd=%d)", peer->GetHost(), peer->GetHandle(), peer->GetFd()); + RemovePeer(peer); + break; - ProcessPackets(peer); + case -1: + sys_err("Recv failed (host=%s peer_handle=%u fd=%d)", peer->GetHost(), peer->GetHandle(), peer->GetFd()); + RemovePeer(peer); + break; + + default: + if (peer == m_pkAuthPeer) + if (g_log) + sys_log(0, "AUTH_PEER_READ: size %d", peer->GetRecvLength()); + + ProcessPackets(peer); + break; } break; diff --git a/src/db/PeerBase.cpp b/src/db/PeerBase.cpp index 675799d..aeb7740 100644 --- a/src/db/PeerBase.cpp +++ b/src/db/PeerBase.cpp @@ -105,7 +105,10 @@ int CPeerBase::Recv() if (bytes_read < 0) { - sys_err("socket_read failed %s", strerror(errno)); + if (errno == 0) + return -2; + + sys_err("socket_read failed: host=%s fd=%d errno=%d (%s)", m_host, m_fd, errno, strerror(errno)); return -1; } else if (bytes_read == 0) diff --git a/src/libthecore/socket.cpp b/src/libthecore/socket.cpp index 4c070e9..4ab3261 100644 --- a/src/libthecore/socket.cpp +++ b/src/libthecore/socket.cpp @@ -45,7 +45,10 @@ int socket_read(socket_t desc, char* read_point, size_t space_left) return ret; if (ret == 0) // 정상적으로 접속 끊김 + { + errno = 0; return -1; + } #ifdef EINTR /* Interrupted system call - various platforms */ if (errno == EINTR)