crtmpserverから見たrtmpプロトコルの具体的な処理の流れ3

2826 ワード

次にクライアントは54 bytesのデータを転送する
Deserializeが復号したメッセージは、4 bytesが消費される
case RM_HEADER_MESSAGETYPE_WINACKSIZE:
	{
		return DeserializeWinAckSize(buffer, message[RM_WINACKSIZE]);
	}

回答は25,000,000,000
だから返事
case RM_HEADER_MESSAGETYPE_WINACKSIZE:
	{
		return ProcessWinAckSize(pFrom, request);
	}
bool BaseRTMPAppProtocolHandler::ProcessWinAckSize(BaseRTMPProtocol *pFrom,
		Variant &request) {
	if (request[RM_WINACKSIZE] != _V_NUMERIC) {
		FATAL("Invalid message: %s", STR(request.ToString()));
		return false;
	}
	uint32_t size = (uint32_t) request[RM_WINACKSIZE];
	if ((size > 4 * 1024 * 1024) || size == 0) {
		FATAL("Invalid message: %s", STR(request.ToString()));
		return false;
	}
	pFrom->SetWinAckSize(request[RM_WINACKSIZE]);
	return true;
}

54 bytesから12+4 bytesを抜いてまだ38残っています
さらに12 bytesを抜いて、まだ26 bytes残っています
Deserializeが復号したメッセージは(ここで残りの26 bytesを完全に消費する)
case RM_HEADER_MESSAGETYPE_FLEX:
	{
		message[RM_INVOKE][RM_INVOKE_IS_FLEX] =
					(bool)(H_MT(header) == RM_HEADER_MESSAGETYPE_FLEX);
		return DeserializeInvoke(buffer, message[RM_INVOKE]);
	}

メッセージの処理(応答)は、以下で行う
bool RTMPProtocolSerializer::DeserializeInvoke(IOBuffer &buffer, Variant &message) {
	if (message[RM_INVOKE_IS_FLEX]) {
		if (!buffer.Ignore(1)) {
			FATAL("Unable to ignore 1 byte");
			return false;
		}
	}

	if (!_amf0.ReadShortString(buffer, message[RM_INVOKE_FUNCTION])) {
		FATAL("Unable to read %s", STR(RM_INVOKE_FUNCTION));
		return false;
	}

	if (!_amf0.ReadDouble(buffer, message[RM_INVOKE_ID])) {
		FATAL("Unable to read %s", STR(RM_INVOKE_ID));
		return false;
	}

	for (uint32_t i = 0; GETAVAILABLEBYTESCOUNT(buffer) > 0; i++) {
		if (!_amf0.Read(buffer, message[RM_INVOKE_PARAMS][i])) {
			FATAL("Unable to de-serialize invoke parameter %u", i);
			return false;
		}
	}

	return true;
}
bool BaseRTMPAppProtocolHandler::InboundMessageAvailable(BaseRTMPProtocol *pFrom,
		Variant &request) {
case RM_HEADER_MESSAGETYPE_FLEX:
		{
			return ProcessInvoke(pFrom, request);
	 ProcessInvokeCreateStream
	}
}
bool BaseRTMPAppProtocolHandler::ProcessInvokeCreateStream(BaseRTMPProtocol *pFrom,
		Variant &request) {
	uint32_t id = 0;

	//1. Create the neutral stream
	if (pFrom->CreateNeutralStream(id) == NULL) {
		FATAL("Unable to create stream");
		return false;
	}

	//2. Send the response
	Variant response = StreamMessageFactory::GetInvokeCreateStreamResult(request, id);
	return SendRTMPMessage(pFrom, response);
}

ここまで来るとデータの処理が終わり、全部で37 bytesのデータをclientに送信しました