SRS 代码分析【RTMP连接请求响应】

服务器启动时调用rtmp端口的监听过程如下:

run_master()-->SrsServer::listen()--->SrsServer::listen_rtmp()
 

listen_rtmp服务端口监听流程如下:

1).获取配置文件中设定的端口列表 _srs_config->get_listens()

2).释放掉已经监听rtmp端口 close_listeners(SrsListenerRtmpStream)

3).根据端口列表创建SrsListener实例,并启动监听listener->listen(ip, port))

srs_error_t SrsServer::listen_rtmp()
{
    srs_error_t err = srs_success;
    
    // stream service port.
    std::vector<std::string> ip_ports = _srs_config->get_listens();
    srs_assert((int)ip_ports.size() > 0);
    
    close_listeners(SrsListenerRtmpStream);
    
    for (int i = 0; i < (int)ip_ports.size(); i++) {
        SrsListener* listener = new SrsBufferListener(this, SrsListenerRtmpStream);
        listeners.push_back(listener);
        
        std::string ip;
        int port;
        srs_parse_endpoint(ip_ports[i], ip, port);
        
        if ((err = listener->listen(ip, port)) != srs_success) {
            srs_error_wrap(err, "rtmp listen %s:%d", ip.c_str(), port);
        }
    }
    
    return err;
}
4). SrsBufferListener::listen()中创建SrsTcpListener的实例并启动监听listener->listen()

srs_error_t SrsBufferListener::listen(string i, int p)
{
    srs_error_t err = srs_success;
    
    ip = i;
    port = p;
    
    srs_freep(listener);
    listener = new SrsTcpListener(this, ip, port);
    
    if ((err = listener->listen()) != srs_success) {
        return srs_error_wrap(err, "buffered tcp listen");
    }
    
    string v = srs_listener_type2string(type);
    srs_trace("%s listen at tcp://%s:%d, fd=%d", v.c_str(), ip.c_str(), port, listener->fd());
    
    return err;
}

5).SrsTcpListener::listen()中绑定监听的端口,开启监听,创建SrsSTCoroutine协程实例,开启协程。

srs_error_t SrsTcpListener::listen()
{
    srs_error_t err = srs_success;
    
    if ((_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        return srs_error_new(ERROR_SOCKET_CREATE, "create socket");
    }
    
    srs_fd_close_exec(_fd);
    srs_socket_reuse_addr(_fd);
    
    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_add
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值