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)