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

RTMPdump(libRTMP) 源代码分析 八: 发送消息(Message)

2013-10-24 
RTMPdump(libRTMP) 源代码分析 8: 发送消息(Message)之前写了一系列的文章介绍RTMPDump各种函数。比如怎么

RTMPdump(libRTMP) 源代码分析 8: 发送消息(Message)

之前写了一系列的文章介绍RTMPDump各种函数。比如怎么建立网络连接(NetConnection),怎么建立网络流(NetStream)之类的,唯独没有介绍这些发送或接收的数据,在底层到底是怎么实现的。本文就是要剖析一下其内部的实现。即这些消息(Message)到底是怎么发送和接收的。

先来看看发送消息吧。

发送connect命令使用函数SendConnectPacket()

发送createstream命令使用RTMP_SendCreateStream()

发送realeaseStream命令使用SendReleaseStream()

发送publish命令使用SendPublish()

发送deleteStream的命令使用SendDeleteStream()

发送pause命令使用RTMP_SendPause()

不再一一例举,发现函数命名有两种规律:RTMP_Send***()或者Send***(),其中*号代表命令的名称。

SendConnectPacket()这个命令是每次程序开始运行的时候发送的第一个命令消息,内容比较多,包含了很多AMF编码的内容,在此不多做分析,贴上代码:

//Socket发送(指明套接字,buffer缓冲区,数据长度)//返回所发数据量intRTMPSockBuf_Send(RTMPSockBuf *sb, const char *buf, int len){  int rc;#ifdef _DEBUG  fwrite(buf, 1, len, netstackdump);#endif#if defined(CRYPTO) && !defined(NO_SSL)  if (sb->sb_ssl)    {      rc = TLS_write((SSL *)sb->sb_ssl, buf, len);    }  else#endif    {//向一个已连接的套接口发送数据。//int send( SOCKET s, const char * buf, int len, int flags);//s:一个用于标识已连接套接口的描述字。//buf:包含待发送数据的缓冲区。   //len:缓冲区中数据的长度。//flags:调用执行方式。//rc:所发数据量。      rc = send(sb->sb_socket, buf, len, 0);    }  return rc;}intRTMPSockBuf_Close(RTMPSockBuf *sb){#if defined(CRYPTO) && !defined(NO_SSL)  if (sb->sb_ssl)    {      TLS_shutdown((SSL *)sb->sb_ssl);      TLS_close((SSL *)sb->sb_ssl);      sb->sb_ssl = NULL;    }#endif  return closesocket(sb->sb_socket);}

到这个函数的时候,发现一层层的调用终于完成了,最后调用了系统Socket的send()函数完成了数据的发送功能。

之前贴过一张图总结这个过程,可能理解起来要方便一些:RTMPDump源代码分析 0: 主要函数调用分析




热点排行