//---------------------------------------------------------------------------- int ServerPoll::_OnRead(ClientContext *pcontext) { _EnterPendingIO(pcontext); StreamSocket streamSocket = pcontext->TheSocket; int nbytes = streamSocket.ReceiveBytes(pcontext->RecvBuf + pcontext->RecvLen, max_recvbuf - pcontext->RecvLen, 0); if (nbytes < 0) { _LeavePendingIO(pcontext); return -1; } _LeavePendingIO(pcontext); pcontext->RecvLen += nbytes; while (pcontext->RecvLen >= MSGLEN_BYTES) { int msglen = *(unsigned short *)pcontext->RecvBuf; int pkglen = msglen + MSGLEN_BYTES; if (pkglen > max_recvbuf) { return -2; } if (pcontext->RecvLen >= pkglen) { BufferEvent *pevent = mBufferEventQue->AllocBufferEvent(msglen); pevent->PushData(pcontext->RecvBuf + MSGLEN_BYTES, msglen); mBufferEventQue->PostBufferEvent(pevent); memmove(pcontext->RecvBuf, pcontext->RecvBuf + pkglen, pcontext->RecvLen - pkglen); pcontext->RecvLen -= pkglen; } else { break; } } return 0; }