服务器启动时调用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