一.端口监听
修改srs.conf配置文件
listen 1935;
max_connections 1000;
srs_log_tank console;
#srs_log_file ./objs/srs.log;
daemon off;
在srs_app_listener.cpp文件中,
而例如http_api中,
进入gdb调试
gdb ./objs/srs
b main
set args -c ./conf/srs.conf /* 设置参数 */
r
进入main函数
b srs_app_config.cpp:3093
c
bt
c
bt
c
bt
调用栈 分析源码,
在 srs_app_server.cpp文件中进一步阅读SrsServer::listen_rtmp()函数
listen协程负责accept,在SrsTcpListener::circle进行accept
b SrsTcpListener::cycle()
c
bt
在srs_app_listener.cpp:271打上断点,当有RTMP客户端请求连接时触发该断点,然后进入handler->on_tcp_client
b srs_app_listener.cpp:271
c
c
c
s
s
bt
从以下堆栈中得出对于RTMP业务,有SrsTcpListener::cycle -> SrsBufferListener::on_tcp_client ->SrsServer::accept_client
不管RTMP是推流还是拉流,每个连接在服务器都对应⼀个SrsRtmpConn对象。SrsRtmpConn持有连接对应的fd。在SrsRtmpConn::SrsRtmpConn(SrsServer* svr, srs_netfd_t c, string cip, int cport)构造函数断点。
创建RTMP连接对象
在srs_app_rtmp_conn.cpp文件中,
得出SrsServer::accept_client-> SrsServer::fd_to_resource->SrsRtmpConn::SrsRtmpConn
RTMP推流和拉流创建连接对象的⽅式是⼀致的,都是创建了SrsRtmpConn。每个SrsRtmpConn都绑定⼀个SrsCoroutine,具体的业务处理在SrsCoroutine的循环进行,对于RTMP而言最终的循环为SrsRtmpConn::cycle。
对于推流和拉流都是在SrsRtmpConn::cycle,只是最终:
推流SrsRtmpConn::do_publishing
拉流SrsRtmpConn::do_playing
具体是在SrsRtmpConn::stream_service_cycle根据RTMP交换协议决定的流程走向。
要启动协程,需要调用:SrsRtmpConn::start()
二.创建连接
判断是不是推流SrsRtmpServer::identify_client
在SrsRtmpConn::stream_service_cycle调⽤SrsRtmpServer::identify_client判断是不是推流。

调用SrsProtocol::decode_message(SrsCommonMessage* msg, SrsPacket** ppacket) 去判断对应数据是属于哪⼀种类型消息。
b SrsCreateStreamPacket::SrsCreateStreamPacket()
b SrsFMLEStartPacket::SrsFMLEStartPacket()
b SrsPlayPacket::SrsPlayPacket()
c
进入推流循环SrsRtmpConn::do_publishing
b srs_app_rtmp_conn.cpp:856
c
bt