首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > PowerDesigner >

RTMPdump 源代码分析 五: 建立一个流媒体连接 (NetConnection部分)

2013-10-23 
RTMPdump 源代码分析 5: 建立一个流媒体连接 (NetConnection部分)本篇文章分析一下RTMPdump里面的建立一个

RTMPdump 源代码分析 5: 建立一个流媒体连接 (NetConnection部分)

本篇文章分析一下RTMPdump里面的建立一个流媒体连接过程中的函数调用。

之前已经简单分析过流媒体链接的建立过程:

RTMP流媒体播放过程

而且分析过其函数调用过程:

RTMPDump源代码分析 0: 主要函数调用分析

在这里就不详细叙述了,其实主要是这两个函数:

RTMP_Connect()

RTMP_ConnectStream()

第一个函数用于建立RTMP中的NetConnection,第二个函数用于建立RTMP中的NetStream。一般是先调用第一个函数,然后调用第二个函数。


下面先来看看RTMP_Connect():

注意:贴上去的源代码是修改过的RTMPdump,我添加了输出信息的代码,形如:r->dlg->AppendCInfo("建立连接:第0次连接。开始建立Socket连接");改代码不影响程序运行,可忽略。

RTMP_Connect()

//第1次连接,从握手开始intRTMP_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;}

该函数做了以下事情:

HandShake()完成握手,之前已经分析过:RTMPdump 源代码分析 4: 连接第一步——握手(Hand Shake)

SendConnectPacket()发送包含“connect”命令的数据报,用于开始建立RTMP连接。具体该函数是怎么调用的,以后有机会再进行分析。

至此RTMP_Connect()分析完毕。


热点排行