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);}
之前贴过一张图总结这个过程,可能理解起来要方便一些:RTMPDump源代码分析 0: 主要函数调用分析