crtmpserverから見たrtmpプロトコルの具体的な処理の流れ3
2826 ワード
次にクライアントは54 bytesのデータを転送する
Deserializeが復号したメッセージは、4 bytesが消費される
回答は25,000,000,000
だから返事
54 bytesから12+4 bytesを抜いてまだ38残っています
さらに12 bytesを抜いて、まだ26 bytes残っています
Deserializeが復号したメッセージは(ここで残りの26 bytesを完全に消費する)
メッセージの処理(応答)は、以下で行う
ここまで来るとデータの処理が終わり、全部で37 bytesのデータをclientに送信しました
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に送信しました