From e9b4a3fcc831a9dab64f9094b12d5baa7050ef56 Mon Sep 17 00:00:00 2001 From: sangbumlikeagod Date: Sun, 22 Dec 2024 11:26:26 +0900 Subject: [PATCH 1/6] feat : make SrsServer http listener to MultiTcpListneres --- trunk/src/app/srs_app_config.cpp | 130 ++++++++++++++++++++++++++++++- trunk/src/app/srs_app_config.hpp | 10 +++ trunk/src/app/srs_app_server.cpp | 37 +++++++++ trunk/src/app/srs_app_server.hpp | 2 +- 4 files changed, 176 insertions(+), 3 deletions(-) diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index eeae92ef1..a29c11895 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -2514,15 +2514,57 @@ srs_error_t SrsConfig::check_normal_config() if (true) { string api = get_http_api_listen(); string server = get_http_stream_listen(); - if (api.empty()) { + vector api_vec = get_http_apis_listens(); + vector server_vec = get_http_streams_listens(); + if (api_vec.empty()) { return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "http_api.listen requires params"); } - if (server.empty()) { + if (server_vec.empty()) { return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "http_server.listen requires params"); } + std::sort(api_vec.begin(), api_vec.end()); + std::sort(server_vec.begin(), server_vec.end()); + + // 교집합 결과를 저장할 벡터 + std::vector intersection_result; + std::vector intersections_result; + + // set_intersection 사용 + std::set_intersection( + api_vec.begin(), api_vec.end(), + server_vec.begin(), server_vec.end(), + std::back_inserter(intersection_result) + ); + + if (intersection_result.size() != 0 && intersection_result != api_vec.size()) + { + return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "http api and server have a intersection, but http server did not include http api"); + } + + string apis = get_https_api_listen(); string servers = get_https_stream_listen(); + vector apis_vec = get_https_apis_listens(); + vector servers_vec = get_https_streams_listens(); + + std::sort(apis_vec.begin(), apis_vec.end()); + std::sort(servers_vec.begin(), servers_vec.end()); + + // 교집합 결과를 저장할 벡터 + + // set_intersection 사용 + std::set_intersection( + apis_vec.begin(), apis_vec.end(), + servers_vec.begin(), servers_vec.end(), + std::back_inserter(intersections_result) + ); + + if (intersections_result.size() != 0 && intersections_result != api_vec.size()) + { + return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "https api and server have a intersection, but https server did not include http api"); + } + if (api == server && apis != servers) { return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "for same http, https api(%s) != server(%s)", apis.c_str(), servers.c_str()); } @@ -7696,6 +7738,26 @@ string SrsConfig::get_http_api_listen() return conf->arg0(); } +std::vector SrsConfig::get_http_apis_listens() +{ + std::vector ports; + if (!srs_getenv("srs.http_api.listen").empty()) { // SRS_LISTEN + return srs_string_split(srs_getenv("srs.http_api.listen"), " "); + } + string DEFAULT = "1985"; + SrsConfDirective* conf = root->get("http_api"); + if (!conf) { + ports.push_back(DEFAULT); + return ports; + } + + for (int i = 0; i < (int)conf->args.size(); i++) { + ports.push_back(conf->args.at(i)); + } + + return ports; +} + bool SrsConfig::get_http_api_crossdomain() { SRS_OVERWRITE_BY_ENV_BOOL2("srs.http_api.crossdomain"); // SRS_HTTP_API_CROSSDOMAIN @@ -7900,6 +7962,31 @@ string SrsConfig::get_https_api_listen() return conf->arg0(); } +std::vector SrsConfig::get_https_apis_listens() +{ + std::vector ports; + if (!srs_getenv("srs.http_api.https.listen").empty()) { // SRS_LISTEN + return srs_string_split(srs_getenv("srs.http_api.https.listen"), " "); + } + static string DEFAULT = "1990"; + if (get_http_api_listen() == get_http_stream_listen()) { + DEFAULT = get_https_stream_listen(); + } + + SrsConfDirective* conf = get_https_api(); + if (!conf) { + ports.push_back(DEFAULT); + return ports; + } + + for (int i = 0; i < (int)conf->args.size(); i++) { + ports.push_back(conf->args.at(i)); + } + + return ports; +} + + string SrsConfig::get_https_api_ssl_key() { SRS_OVERWRITE_BY_ENV_STRING("srs.http_api.https.key"); // SRS_HTTP_API_HTTPS_KEY @@ -8315,6 +8402,25 @@ bool SrsConfig::get_http_stream_enabled(SrsConfDirective* conf) return SRS_CONF_PREFER_FALSE(conf->arg0()); } +std::vector SrsConfig::get_http_streams_listens() +{ + std::vector ports; + if (!srs_getenv("srs.http_server.listen").empty()) { // SRS_LISTEN + return srs_string_split(srs_getenv("srs.http_server.listen"), " "); + } + string DEFAULT = "8080"; + SrsConfDirective* conf = root->get("http_server"); + if (!conf) { + ports.push_back(DEFAULT); + return ports; + } + + for (int i = 0; i < (int)conf->args.size(); i++) { + ports.push_back(conf->args.at(i)); + } + + return ports; +} string SrsConfig::get_http_stream_listen() { @@ -8421,6 +8527,26 @@ string SrsConfig::get_https_stream_listen() return conf->arg0(); } +std::vector SrsConfig::get_https_streams_listens() +{ + std::vector ports; + if (!srs_getenv("srs.http_server.https.listen").empty()) { // SRS_LISTEN + return srs_string_split(srs_getenv("srs.http_server.https.listen"), " "); + } + static string DEFAULT = "8088"; + SrsConfDirective* conf = get_https_stream(); + if (!conf) { + ports.push_back(DEFAULT); + return ports; + } + + for (int i = 0; i < (int)conf->args.size(); i++) { + ports.push_back(conf->args.at(i)); + } + + return ports; +} + string SrsConfig::get_https_stream_ssl_key() { SRS_OVERWRITE_BY_ENV_STRING("srs.http_server.https.key"); // SRS_HTTP_SERVER_HTTPS_KEY diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index e7432d14c..9e159a48d 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -1031,6 +1031,10 @@ public: virtual bool get_http_api_enabled(); // Get the http api listen port. virtual std::string get_http_api_listen(); + // Get the http api listen port. + // user can specifies multiple listen ports, + // each args of directive is a listen port. + virtual std::vector get_http_apis_listens(); // Whether enable crossdomain for http api. virtual bool get_http_api_crossdomain(); // Whether enable the HTTP RAW API. @@ -1053,6 +1057,7 @@ private: public: virtual bool get_https_api_enabled(); virtual std::string get_https_api_listen(); + virtual std::vector get_https_apis_listens(); virtual std::string get_https_api_ssl_key(); virtual std::string get_https_api_ssl_cert(); // http stream section @@ -1065,6 +1070,10 @@ public: virtual bool get_http_stream_enabled(); // Get the http stream listen port. virtual std::string get_http_stream_listen(); + // Get the http stream listen port. + // user can specifies multiple listen ports, + // each args of directive is a listen port. + virtual std::vector get_http_streams_listens(); // Get the http stream root dir. virtual std::string get_http_stream_dir(); // Whether enable crossdomain for http static and stream server. @@ -1075,6 +1084,7 @@ private: public: virtual bool get_https_stream_enabled(); virtual std::string get_https_stream_listen(); + virtual std::vector get_https_streams_listens(); virtual std::string get_https_stream_ssl_key(); virtual std::string get_https_stream_ssl_cert(); public: diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 767429b24..e5d82e291 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -493,6 +493,13 @@ srs_error_t SrsServer::initialize() bool stream = _srs_config->get_http_stream_enabled(); string http_listen = _srs_config->get_http_stream_listen(); string https_listen = _srs_config->get_https_stream_listen(); + vector server_vec = get_http_streams_listens(); + vector servers_vec = get_https_streams_listens(); + std::sort(server_vec.begin(), server_vec.end()); + std::sort(servers_vec.begin(), servers_vec.end()); + + + #ifdef SRS_RTC bool rtc = _srs_config->get_rtc_server_enabled(); @@ -513,6 +520,36 @@ srs_error_t SrsServer::initialize() bool api = _srs_config->get_http_api_enabled(); string api_listen = _srs_config->get_http_api_listen(); string apis_listen = _srs_config->get_https_api_listen(); + vector api_vec = get_http_apis_listens(); + vector apis_vec = get_https_apis_listens(); + + std::sort(api_vec.begin(), api_vec.end()); + std::sort(apis_vec.begin(), apis_vec.end()); + + std::vector intersection_result; + std::vector intersections_result; + + std::set_intersection( + api_vec.begin(), api_vec.end(), + server_vec.begin(), server_vec.end(), + std::back_inserter(intersection_result) + ); + + if (intersection_result.size() == 0) + { + reuse_api_over_server_ = false; + } + else if (intersection_result.size() == api_vec.size()) + { + reuse_api_over_server_ = true; + } + else + { + return srs_error_wrap(err, "http api initialize"); + } + + + if (stream && api && api_listen == http_listen && apis_listen == https_listen) { srs_trace("API reuses http=%s and https=%s server", http_listen.c_str(), https_listen.c_str()); reuse_api_over_server_ = true; diff --git a/trunk/src/app/srs_app_server.hpp b/trunk/src/app/srs_app_server.hpp index 07fb52cc4..db5e49701 100644 --- a/trunk/src/app/srs_app_server.hpp +++ b/trunk/src/app/srs_app_server.hpp @@ -116,7 +116,7 @@ private: bool reuse_api_over_server_; // If reusing, WebRTC TCP use the same port of HTTP server. bool reuse_rtc_over_server_; - // RTMP stream listeners, over TCP. + // RTMP stream listeners, over TCP. SrsMultipleTcpListeners* rtmp_listener_; // HTTP API listener, over TCP. Please note that it might reuse with stream listener. SrsTcpListener* api_listener_; From 1e848d96e7bbdd8ec9d9ac2a872045fe59e0aebb Mon Sep 17 00:00:00 2001 From: sangbumlikeagod Date: Sun, 22 Dec 2024 16:33:09 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat=20:=201.=20change=20api=5Flistener=5F,?= =?UTF-8?q?=20apis=5Flistener=5F,=20http=5Flistener=5F,=20https=5Flistener?= =?UTF-8?q?=5F=20to=20SrsMultipleTcpListeners=202.=20for=20reusing=20?= =?UTF-8?q?=E2=80=98httpmux=20logic=E2=80=99.=20=20enable=20listener=20onl?= =?UTF-8?q?y=20when=20=E2=80=98api=5Flistener=E2=80=99=20and=20=20?= =?UTF-8?q?=E2=80=98http=5Flistener=E2=80=99=20have=20zero=20intersection,?= =?UTF-8?q?=20or=20=E2=80=98http=5Flistener=E2=80=99=20contains=20whole=20?= =?UTF-8?q?=E2=80=98api=5Flistener=E2=80=99.=20same=20for=20=E2=80=98apis?= =?UTF-8?q?=5Flistener=5F=E2=80=99=20and=20=E2=80=98https=5Flisteners=5F?= =?UTF-8?q?=E2=80=99.=20otherwise=20occurs=20error.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- trunk/src/app/srs_app_config.cpp | 42 ++++++-------- trunk/src/app/srs_app_server.cpp | 94 ++++++++++++++++++-------------- trunk/src/app/srs_app_server.hpp | 8 +-- 3 files changed, 74 insertions(+), 70 deletions(-) diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index a29c11895..edae0647b 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -2512,8 +2512,6 @@ srs_error_t SrsConfig::check_normal_config() // Check HTTP API and server. //////////////////////////////////////////////////////////////////////// if (true) { - string api = get_http_api_listen(); - string server = get_http_stream_listen(); vector api_vec = get_http_apis_listens(); vector server_vec = get_http_streams_listens(); if (api_vec.empty()) { @@ -2526,50 +2524,42 @@ srs_error_t SrsConfig::check_normal_config() std::sort(api_vec.begin(), api_vec.end()); std::sort(server_vec.begin(), server_vec.end()); - // 교집합 결과를 저장할 벡터 std::vector intersection_result; std::vector intersections_result; - - // set_intersection 사용 std::set_intersection( api_vec.begin(), api_vec.end(), server_vec.begin(), server_vec.end(), std::back_inserter(intersection_result) ); - if (intersection_result.size() != 0 && intersection_result != api_vec.size()) + bool isNotSameHttp = intersection_result.size() == 0; + bool isFullyContainedHttp = intersection_result.size() != 0 && intersection_result.size() == api_vec.size(); + if (!isNotSameHttp && !isFullyContainedHttp) { - return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "http api and server have a intersection, but http server did not include http api"); + return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "http api and server have a intersection, but http server doesn't fully contain http api"); } - - - string apis = get_https_api_listen(); - string servers = get_https_stream_listen(); vector apis_vec = get_https_apis_listens(); vector servers_vec = get_https_streams_listens(); std::sort(apis_vec.begin(), apis_vec.end()); std::sort(servers_vec.begin(), servers_vec.end()); - - // 교집합 결과를 저장할 벡터 - - // set_intersection 사용 std::set_intersection( apis_vec.begin(), apis_vec.end(), servers_vec.begin(), servers_vec.end(), std::back_inserter(intersections_result) ); - if (intersections_result.size() != 0 && intersections_result != api_vec.size()) + bool isNotSameHttps = intersections_result.size() == 0; + bool isFullyContainedHttps = intersections_result.size() != 0 && intersections_result.size() == apis_vec.size(); + if (!isNotSameHttps && !isFullyContainedHttps) { - return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "https api and server have a intersection, but https server did not include http api"); + return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "https api and server have a intersection, but https server doesn't fully contain https api"); } - - if (api == server && apis != servers) { - return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "for same http, https api(%s) != server(%s)", apis.c_str(), servers.c_str()); + if (!isNotSameHttp && isNotSameHttps) { + return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "for same http, https api != server"); } - if (apis == servers && api != server) { - return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "for same https, http api(%s) != server(%s)", api.c_str(), server.c_str()); + if (!isNotSameHttps && isNotSameHttp) { + return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "for same https, http api != server"); } if (get_https_api_enabled() && !get_http_api_enabled()) { @@ -7750,7 +7740,7 @@ std::vector SrsConfig::get_http_apis_listens() ports.push_back(DEFAULT); return ports; } - + conf = conf->get("listen"); for (int i = 0; i < (int)conf->args.size(); i++) { ports.push_back(conf->args.at(i)); } @@ -7978,7 +7968,7 @@ std::vector SrsConfig::get_https_apis_listens() ports.push_back(DEFAULT); return ports; } - + conf = conf->get("listen"); for (int i = 0; i < (int)conf->args.size(); i++) { ports.push_back(conf->args.at(i)); } @@ -8414,7 +8404,7 @@ std::vector SrsConfig::get_http_streams_listens() ports.push_back(DEFAULT); return ports; } - + conf = conf->get("listen"); for (int i = 0; i < (int)conf->args.size(); i++) { ports.push_back(conf->args.at(i)); } @@ -8539,7 +8529,7 @@ std::vector SrsConfig::get_https_streams_listens() ports.push_back(DEFAULT); return ports; } - + conf = conf->get("listen"); for (int i = 0; i < (int)conf->args.size(); i++) { ports.push_back(conf->args.at(i)); } diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index e5d82e291..e259155e4 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -336,10 +336,10 @@ SrsServer::SrsServer() ppid = ::getppid(); rtmp_listener_ = new SrsMultipleTcpListeners(this); - api_listener_ = new SrsTcpListener(this); - apis_listener_ = new SrsTcpListener(this); - http_listener_ = new SrsTcpListener(this); - https_listener_ = new SrsTcpListener(this); + api_listener_ = new SrsMultipleTcpListeners(this); + apis_listener_ = new SrsMultipleTcpListeners(this); + http_listener_ = new SrsMultipleTcpListeners(this); + https_listener_ = new SrsMultipleTcpListeners(this); webrtc_listener_ = new SrsTcpListener(this); stream_caster_flv_listener_ = new SrsHttpFlvListener(); stream_caster_mpegts_ = new SrsUdpCasterListener(); @@ -491,10 +491,8 @@ srs_error_t SrsServer::initialize() _srs_config->subscribe(this); bool stream = _srs_config->get_http_stream_enabled(); - string http_listen = _srs_config->get_http_stream_listen(); - string https_listen = _srs_config->get_https_stream_listen(); - vector server_vec = get_http_streams_listens(); - vector servers_vec = get_https_streams_listens(); + vector server_vec = _srs_config->get_http_streams_listens(); + vector servers_vec = _srs_config->get_https_streams_listens(); std::sort(server_vec.begin(), server_vec.end()); std::sort(servers_vec.begin(), servers_vec.end()); @@ -506,22 +504,26 @@ srs_error_t SrsServer::initialize() bool rtc_tcp = _srs_config->get_rtc_server_tcp_enabled(); string rtc_listen = srs_int2str(_srs_config->get_rtc_server_tcp_listen()); // If enabled and listen is the same value, resue port for WebRTC over TCP. - if (stream && rtc && rtc_tcp && http_listen == rtc_listen) { - srs_trace("WebRTC tcp=%s reuses http=%s server", rtc_listen.c_str(), http_listen.c_str()); - reuse_rtc_over_server_ = true; + for (string http_listen : server_vec) + { + if (stream && rtc && rtc_tcp && http_listen == rtc_listen) { + srs_trace("WebRTC tcp=%s reuses http=%s server", rtc_listen.c_str(), http_listen.c_str()); + reuse_rtc_over_server_ = true; + } } - if (stream && rtc && rtc_tcp && https_listen == rtc_listen) { - srs_trace("WebRTC tcp=%s reuses https=%s server", rtc_listen.c_str(), https_listen.c_str()); - reuse_rtc_over_server_ = true; + for (string https_listen : servers_vec) + { + if (stream && rtc && rtc_tcp && https_listen == rtc_listen) { + srs_trace("WebRTC tcp=%s reuses https=%s server", rtc_listen.c_str(), https_listen.c_str()); + reuse_rtc_over_server_ = true; + } } #endif // If enabled and the listen is the same value, reuse port. bool api = _srs_config->get_http_api_enabled(); - string api_listen = _srs_config->get_http_api_listen(); - string apis_listen = _srs_config->get_https_api_listen(); - vector api_vec = get_http_apis_listens(); - vector apis_vec = get_https_apis_listens(); + vector api_vec = _srs_config->get_http_apis_listens(); + vector apis_vec = _srs_config->get_https_apis_listens(); std::sort(api_vec.begin(), api_vec.end()); std::sort(apis_vec.begin(), apis_vec.end()); @@ -534,26 +536,38 @@ srs_error_t SrsServer::initialize() server_vec.begin(), server_vec.end(), std::back_inserter(intersection_result) ); + std::set_intersection( + apis_vec.begin(), apis_vec.end(), + servers_vec.begin(), servers_vec.end(), + std::back_inserter(intersections_result) + ); + bool isNotSameHttp = intersection_result.size() == 0; + bool isFullyContainedHttp = intersection_result.size() != 0 && intersection_result.size() == api_vec.size(); + bool isNotSameHttps = intersections_result.size() == 0; + bool isFullyContainedHttps = intersections_result.size() != 0 && intersections_result.size() == apis_vec.size(); - if (intersection_result.size() == 0) + if ((!isNotSameHttp && !isFullyContainedHttp) || (!isNotSameHttps && !isFullyContainedHttps)) + { + return srs_error_wrap(err, "http api and http server have a intersection. but http server doesn't fully contain http api"); + } + + if (stream && api && isFullyContainedHttp && isFullyContainedHttps) + { + srs_trace("API reuses http and https server"); + for (string http_listen : intersection_result) + { + srs_trace("API reuses http=%s server", http_listen.c_str()); + } + for (string https_listen : intersections_result) + { + srs_trace("API reuses https=%s server", https_listen.c_str()); + } + reuse_api_over_server_ = true; + } + else if (isNotSameHttp && isNotSameHttps) { reuse_api_over_server_ = false; } - else if (intersection_result.size() == api_vec.size()) - { - reuse_api_over_server_ = true; - } - else - { - return srs_error_wrap(err, "http api initialize"); - } - - - - if (stream && api && api_listen == http_listen && apis_listen == https_listen) { - srs_trace("API reuses http=%s and https=%s server", http_listen.c_str(), https_listen.c_str()); - reuse_api_over_server_ = true; - } // Only init HTTP API when not reusing HTTP server. if (!reuse_api_over_server_) { @@ -622,8 +636,8 @@ srs_error_t SrsServer::listen() if (reuse_api_over_server_) { srs_trace("HTTP-API: Reuse listen to http server %s", _srs_config->get_http_stream_listen().c_str()); } else { - api_listener_->set_endpoint(_srs_config->get_http_api_listen())->set_label("HTTP-API"); - if ((err = api_listener_->listen()) != srs_success) { + api_listener_->add(_srs_config->get_http_apis_listens())->set_label("HTTP_API"); + if ((err = api_listener_->listen()) != srs_success) { return srs_error_wrap(err, "http api listen"); } } @@ -634,8 +648,8 @@ srs_error_t SrsServer::listen() if (reuse_api_over_server_) { srs_trace("HTTPS-API: Reuse listen to http server %s", _srs_config->get_https_stream_listen().c_str()); } else { - apis_listener_->set_endpoint(_srs_config->get_https_api_listen())->set_label("HTTPS-API"); - if ((err = apis_listener_->listen()) != srs_success) { + apis_listener_->add(_srs_config->get_https_apis_listens())->set_label("HTTPS_API"); + if ((err = apis_listener_->listen()) != srs_success) { return srs_error_wrap(err, "https api listen"); } } @@ -643,7 +657,7 @@ srs_error_t SrsServer::listen() // Create HTTP server listener. if (_srs_config->get_http_stream_enabled()) { - http_listener_->set_endpoint(_srs_config->get_http_stream_listen())->set_label("HTTP-Server"); + http_listener_->add(_srs_config->get_http_streams_listens())->set_label("HTTP-Server"); if ((err = http_listener_->listen()) != srs_success) { return srs_error_wrap(err, "http server listen"); } @@ -651,7 +665,7 @@ srs_error_t SrsServer::listen() // Create HTTPS server listener. if (_srs_config->get_https_stream_enabled()) { - https_listener_->set_endpoint(_srs_config->get_https_stream_listen())->set_label("HTTPS-Server"); + https_listener_->add(_srs_config->get_https_streams_listens())->set_label("HTTPS-Server"); if ((err = https_listener_->listen()) != srs_success) { return srs_error_wrap(err, "https server listen"); } diff --git a/trunk/src/app/srs_app_server.hpp b/trunk/src/app/srs_app_server.hpp index db5e49701..0fe6322a5 100644 --- a/trunk/src/app/srs_app_server.hpp +++ b/trunk/src/app/srs_app_server.hpp @@ -119,15 +119,15 @@ private: // RTMP stream listeners, over TCP. SrsMultipleTcpListeners* rtmp_listener_; // HTTP API listener, over TCP. Please note that it might reuse with stream listener. - SrsTcpListener* api_listener_; + SrsMultipleTcpListeners* api_listener_; // HTTPS API listener, over TCP. Please note that it might reuse with stream listener. - SrsTcpListener* apis_listener_; + SrsMultipleTcpListeners* apis_listener_; // HTTP server listener, over TCP. Please note that request of both HTTP static and stream are served by this // listener, and it might be reused by HTTP API and WebRTC TCP. - SrsTcpListener* http_listener_; + SrsMultipleTcpListeners* http_listener_; // HTTPS server listener, over TCP. Please note that request of both HTTP static and stream are served by this // listener, and it might be reused by HTTP API and WebRTC TCP. - SrsTcpListener* https_listener_; + SrsMultipleTcpListeners* https_listener_; // WebRTC over TCP listener. Please note that there is always a UDP listener by RTC server. SrsTcpListener* webrtc_listener_; // Stream Caster for push over HTTP-FLV. From 220f7431e1c00d34ab5c875b2fcaf23c6a6e3dc4 Mon Sep 17 00:00:00 2001 From: sangbumlikeagod Date: Sun, 29 Dec 2024 11:16:40 +0900 Subject: [PATCH 3/6] handle exception for listen parameter doesn't exist --- trunk/src/app/srs_app_config.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index edae0647b..ea2fb6d57 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -7741,6 +7741,10 @@ std::vector SrsConfig::get_http_apis_listens() return ports; } conf = conf->get("listen"); + if (!conf) { + ports.push_back(DEFAULT); + return ports; + } for (int i = 0; i < (int)conf->args.size(); i++) { ports.push_back(conf->args.at(i)); } @@ -7969,6 +7973,10 @@ std::vector SrsConfig::get_https_apis_listens() return ports; } conf = conf->get("listen"); + if (!conf) { + ports.push_back(DEFAULT); + return ports; + } for (int i = 0; i < (int)conf->args.size(); i++) { ports.push_back(conf->args.at(i)); } @@ -8405,6 +8413,10 @@ std::vector SrsConfig::get_http_streams_listens() return ports; } conf = conf->get("listen"); + if (!conf) { + ports.push_back(DEFAULT); + return ports; + } for (int i = 0; i < (int)conf->args.size(); i++) { ports.push_back(conf->args.at(i)); } @@ -8530,6 +8542,10 @@ std::vector SrsConfig::get_https_streams_listens() return ports; } conf = conf->get("listen"); + if (!conf) { + ports.push_back(DEFAULT); + return ports; + } for (int i = 0; i < (int)conf->args.size(); i++) { ports.push_back(conf->args.at(i)); } From f8fd43816a6d1f77c4b5c2f191909bd3d1efe981 Mon Sep 17 00:00:00 2001 From: sangbumlikeagod Date: Sun, 29 Dec 2024 11:54:40 +0900 Subject: [PATCH 4/6] replace range-base for loop for 'build-centos7' case --- trunk/src/app/srs_app_server.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index e259155e4..17affc52b 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -504,15 +504,17 @@ srs_error_t SrsServer::initialize() bool rtc_tcp = _srs_config->get_rtc_server_tcp_enabled(); string rtc_listen = srs_int2str(_srs_config->get_rtc_server_tcp_listen()); // If enabled and listen is the same value, resue port for WebRTC over TCP. - for (string http_listen : server_vec) + for (int idx = 0; idx < server_vec.size(); idx++) { + string http_listen = server_vec[idx]; if (stream && rtc && rtc_tcp && http_listen == rtc_listen) { srs_trace("WebRTC tcp=%s reuses http=%s server", rtc_listen.c_str(), http_listen.c_str()); reuse_rtc_over_server_ = true; } } - for (string https_listen : servers_vec) + for (int idx = 0; idx < server_vecs.size(); idx++) { + string https_listen = server_vec[idx]; if (stream && rtc && rtc_tcp && https_listen == rtc_listen) { srs_trace("WebRTC tcp=%s reuses https=%s server", rtc_listen.c_str(), https_listen.c_str()); reuse_rtc_over_server_ = true; @@ -554,12 +556,14 @@ srs_error_t SrsServer::initialize() if (stream && api && isFullyContainedHttp && isFullyContainedHttps) { srs_trace("API reuses http and https server"); - for (string http_listen : intersection_result) + for (int idx = 0; idx < intersection_result.size(); idx++) { + string http_listen = intersection_result[idx]; srs_trace("API reuses http=%s server", http_listen.c_str()); } - for (string https_listen : intersections_result) + for (int idx = 0; idx < intersections_result.size(); idx++) { + string https_listen = intersections_result[idx]; srs_trace("API reuses https=%s server", https_listen.c_str()); } reuse_api_over_server_ = true; From b320fdd90945a4388cfea713a5f2cd023d003747 Mon Sep 17 00:00:00 2001 From: sangbumlikeagod Date: Sun, 29 Dec 2024 11:59:34 +0900 Subject: [PATCH 5/6] fix naming issue --- trunk/src/app/srs_app_server.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 17affc52b..735286a8b 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -512,9 +512,9 @@ srs_error_t SrsServer::initialize() reuse_rtc_over_server_ = true; } } - for (int idx = 0; idx < server_vecs.size(); idx++) + for (int idx = 0; idx < servers_vec.size(); idx++) { - string https_listen = server_vec[idx]; + string https_listen = servers_vec[idx]; if (stream && rtc && rtc_tcp && https_listen == rtc_listen) { srs_trace("WebRTC tcp=%s reuses https=%s server", rtc_listen.c_str(), https_listen.c_str()); reuse_rtc_over_server_ = true; From 9affdfda03b660e32235f4b4198a25da20725b37 Mon Sep 17 00:00:00 2001 From: sangbumlikeagod Date: Mon, 30 Dec 2024 01:04:33 +0900 Subject: [PATCH 6/6] change log message --- trunk/src/app/srs_app_config.cpp | 8 ++++---- trunk/src/app/srs_app_server.cpp | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index ea2fb6d57..6b2ef5123 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -2533,10 +2533,10 @@ srs_error_t SrsConfig::check_normal_config() ); bool isNotSameHttp = intersection_result.size() == 0; - bool isFullyContainedHttp = intersection_result.size() != 0 && intersection_result.size() == api_vec.size(); + bool isFullyContainedHttp = !isNotSameHttp && intersection_result.size() == api_vec.size(); if (!isNotSameHttp && !isFullyContainedHttp) { - return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "http api and server have a intersection, but http server doesn't fully contain http api"); + return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "http api and http server intersect in functionality, but an http server does not fully encapsulate an http api"); } vector apis_vec = get_https_apis_listens(); vector servers_vec = get_https_streams_listens(); @@ -2550,10 +2550,10 @@ srs_error_t SrsConfig::check_normal_config() ); bool isNotSameHttps = intersections_result.size() == 0; - bool isFullyContainedHttps = intersections_result.size() != 0 && intersections_result.size() == apis_vec.size(); + bool isFullyContainedHttps = !isNotSameHttps && intersections_result.size() == apis_vec.size(); if (!isNotSameHttps && !isFullyContainedHttps) { - return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "https api and server have a intersection, but https server doesn't fully contain https api"); + return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "https api and https server intersect in functionality, but an https server does not fully encapsulate an https api"); } if (!isNotSameHttp && isNotSameHttps) { return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "for same http, https api != server"); diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 735286a8b..640aab806 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -544,13 +544,13 @@ srs_error_t SrsServer::initialize() std::back_inserter(intersections_result) ); bool isNotSameHttp = intersection_result.size() == 0; - bool isFullyContainedHttp = intersection_result.size() != 0 && intersection_result.size() == api_vec.size(); + bool isFullyContainedHttp = !isNotSameHttp && intersection_result.size() == api_vec.size(); bool isNotSameHttps = intersections_result.size() == 0; - bool isFullyContainedHttps = intersections_result.size() != 0 && intersections_result.size() == apis_vec.size(); + bool isFullyContainedHttps = !isNotSameHttps && intersections_result.size() == apis_vec.size(); if ((!isNotSameHttp && !isFullyContainedHttp) || (!isNotSameHttps && !isFullyContainedHttps)) { - return srs_error_wrap(err, "http api and http server have a intersection. but http server doesn't fully contain http api"); + return srs_error_wrap(err, "http api and http server intersect in functionality, but an http server does not fully encapsulate an http api"); } if (stream && api && isFullyContainedHttp && isFullyContainedHttps)