Ejemplo n.º 1
0
//----------------------------------------------------------------------------
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;
}