RTMPdump (libRTMP) 源代码分析4: 连接第一步——握手 (HandShake)
RTMPdump (libRTMP) 源代码分析7: 建立一个流媒体连接 (NetStream部分 2)
RTMPdump (libRTMP) 源代码分析10: 处理各种消息 (Message)
在这里就不详细叙述了,其实主要是这两个函数:
RTMP_Connect()
RTMP_Connect0()
再来看看RTMP_Connect1(),这是真正建立RTMP连接的函数:
- //第1次连接,从握手开始
- int
- RTMP_Connect1(RTMP *r, RTMPPacket *cp)
- {
- if (r->Link.protocol & RTMP_FEATURE_SSL)
- {
- #if defined(CRYPTO) && !defined(NO_SSL)
- TLS_client(RTMP_TLS_ctx, r->m_sb.sb_ssl);
- TLS_setfd((SSL *)r->m_sb.sb_ssl, r->m_sb.sb_socket);
- if (TLS_connect((SSL *)r->m_sb.sb_ssl) < 0)
- {
- RTMP_Log(RTMP_LOGERROR, "%s, TLS_Connect failed", __FUNCTION__);
- RTMP_Close(r);
- return FALSE;
- }
- #else
- RTMP_Log(RTMP_LOGERROR, "%s, no SSL/TLS support", __FUNCTION__);
- RTMP_Close(r);
- return FALSE;
- #endif
- }
- //使用HTTP
- if (r->Link.protocol & RTMP_FEATURE_HTTP)
- {
- r->m_msgCounter = 1;
- r->m_clientID.av_val = NULL;
- r->m_clientID.av_len = 0;
- HTTP_Post(r, RTMPT_OPEN, "", 1);
- HTTP_read(r, 1);
- r->m_msgCounter = 0;
- }
- RTMP_Log(RTMP_LOGDEBUG, "%s, ... connected, handshaking", __FUNCTION__);
- //握手----------------
- r->dlg->AppendCInfo("建立连接:第1次连接。开始握手(HandShake)");
- //-----------------------------
- RTMP_LogPrintf("开始握手(HandShake)!\n");
- if (!HandShake(r, TRUE))
- {
- //----------------
- r->dlg->AppendCInfo("建立连接:第1次连接。握手(HandShake)失败!");
- //-----------------------------
- RTMP_Log(RTMP_LOGERROR, "%s, handshake failed.", __FUNCTION__);
- RTMP_Close(r);
- return FALSE;
- }
- //----------------
- r->dlg->AppendCInfo("建立连接:第1次连接。握手(HandShake)成功");
- //-----------------------------
- RTMP_LogPrintf("握手(HandShake)完毕!\n");
- RTMP_Log(RTMP_LOGDEBUG, "%s, handshaked", __FUNCTION__);
- //发送“connect”命令--------------
- //----------------
- r->dlg->AppendCInfo("建立连接:第1次连接。开始建立网络连接(NetConnection)");
- //-----------------------------
- RTMP_LogPrintf("开始建立网络连接(NetConnection)!\n");
- //----------------
- r->dlg->AppendCInfo("发送数据。消息 命令 (typeID=20) (Connect)。");
- //-----------------------------
- if (!SendConnectPacket(r, cp))
- {
- //----------------
- r->dlg->AppendCInfo("建立连接:第1次连接。建立网络连接(NetConnection)失败!");
- //-----------------------------
- RTMP_Log(RTMP_LOGERROR, "%s, RTMP connect failed.", __FUNCTION__);
- RTMP_Close(r);
- return FALSE;
- }
- //----------------
- r->dlg->AppendCInfo("建立连接:第1次连接。建立网络连接(NetConnection)成功");
- //-----------------------------
- RTMP_LogPrintf("命令消息“Connect”发送完毕!\n");
- return TRUE;
- }
至此RTMP_Connect()分析完毕。