//------------------------------------------------------------------------------------- bool ClientObject::processSocket(bool expectingPacket) { Mercury::TCPPacket* pReceiveWindow = Mercury::TCPPacket::ObjPool().createObject(); int len = pReceiveWindow->recvFromEndPoint(*pChannel_->endpoint()); if (len < 0) { Mercury::TCPPacket::ObjPool().reclaimObject(pReceiveWindow); PacketReceiver::RecvState rstate = this->checkSocketErrors(len, expectingPacket); if(rstate == Mercury::PacketReceiver::RECV_STATE_INTERRUPT) { Bots::getSingleton().pEventPoller()->deregisterForRead(*pChannel_->endpoint()); pChannel_->destroy(); Bots::getSingleton().delClient(this); return false; } return rstate == Mercury::PacketReceiver::RECV_STATE_CONTINUE; } else if(len == 0) // 客户端正常退出 { Mercury::TCPPacket::ObjPool().reclaimObject(pReceiveWindow); Bots::getSingleton().pEventPoller()->deregisterForRead(*pChannel_->endpoint()); pChannel_->destroy(); Bots::getSingleton().delClient(this); return false; } pChannel_->addReceiveWindow(pReceiveWindow); Mercury::Reason ret = this->processPacket(pChannel_, pReceiveWindow); if(ret != Mercury::REASON_SUCCESS) { ERROR_MSG(boost::format("ClientObject::processSocket: " "Throwing %1%\n") % Mercury::reasonToString(ret)); } return true; }