From 4a69499f2c989c6748517a6efdd8c490ca7c4b4b Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 21 Feb 2020 23:11:09 +0800 Subject: [PATCH 1/2] Fix bug for librtmp client ipv4/ipv6 socket. 3.0.122 --- README.md | 1 + trunk/src/core/srs_core_version3.hpp | 2 +- trunk/src/libs/srs_lib_simple_socket.cpp | 45 +++++++++++++++++------- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index eb7664c91..4f4ee7545 100755 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-02-21, Fix bug for librtmp client ipv4/ipv6 socket. 3.0.122 * v3.0, 2020-02-18, For [#1579][bug #1579], support start/final wait for gracefully quit. 3.0.121 * v3.0, 2020-02-18, For [#1579][bug #1579], support force gracefully quit. 3.0.120 * v3.0, 2020-02-18, For [#1579][bug #1579], support gracefully quit. 3.0.119 diff --git a/trunk/src/core/srs_core_version3.hpp b/trunk/src/core/srs_core_version3.hpp index ac541b5e4..801fd91fe 100644 --- a/trunk/src/core/srs_core_version3.hpp +++ b/trunk/src/core/srs_core_version3.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION3_HPP #define SRS_CORE_VERSION3_HPP -#define SRS_VERSION3_REVISION 121 +#define SRS_VERSION3_REVISION 122 #endif diff --git a/trunk/src/libs/srs_lib_simple_socket.cpp b/trunk/src/libs/srs_lib_simple_socket.cpp index d67a48308..59adf2278 100644 --- a/trunk/src/libs/srs_lib_simple_socket.cpp +++ b/trunk/src/libs/srs_lib_simple_socket.cpp @@ -77,8 +77,11 @@ #ifndef SRS_HIJACK_IO struct SrsBlockSyncSocket { + int family; SOCKET fd; - int family; + SOCKET fdv4; + SOCKET fdv6; + // Bytes transmit. int64_t rbytes; int64_t sbytes; // The send/recv timeout in ms. @@ -86,15 +89,26 @@ struct SrsBlockSyncSocket int64_t stm; SrsBlockSyncSocket() { + family = AF_UNSPEC; stm = rtm = SRS_UTIME_NO_TIMEOUT; rbytes = sbytes = 0; SOCKET_RESET(fd); + SOCKET_RESET(fdv4); + SOCKET_RESET(fdv6); SOCKET_SETUP(); } virtual ~SrsBlockSyncSocket() { - SOCKET_CLOSE(fd); + if (SOCKET_VALID(fd)) { + SOCKET_CLOSE(fd); + } + if (SOCKET_VALID(fdv4)) { + SOCKET_CLOSE(fdv4); + } + if (SOCKET_VALID(fdv6)) { + SOCKET_CLOSE(fdv6); + } SOCKET_CLEANUP(); } }; @@ -112,19 +126,17 @@ int srs_hijack_io_create_socket(srs_hijack_io_t ctx, srs_rtmp_t owner) { SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx; - skt->family = AF_INET6; - skt->fd = ::socket(skt->family, SOCK_STREAM, 0); // Try IPv6 first. - if (!SOCKET_VALID(skt->fd)) { - skt->family = AF_INET; - skt->fd = ::socket(skt->family, SOCK_STREAM, 0); // Try IPv4 instead, if IPv6 fails. - } - if (!SOCKET_VALID(skt->fd)) { + skt->family = AF_UNSPEC; + skt->fdv4 = ::socket(AF_INET, SOCK_STREAM, 0); + skt->fdv6 = ::socket(AF_INET6, SOCK_STREAM, 0); + if (!SOCKET_VALID(skt->fdv4) && !SOCKET_VALID(skt->fdv4)) { return ERROR_SOCKET_CREATE; } // No TCP cache. int v = 1; - setsockopt(skt->fd, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v)); + setsockopt(skt->fdv4, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v)); + setsockopt(skt->fdv6, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v)); return ERROR_SUCCESS; } @@ -137,7 +149,7 @@ int srs_hijack_io_connect(srs_hijack_io_t ctx, const char* server_ip, int port) addrinfo hints; memset(&hints, 0, sizeof(hints)); - hints.ai_family = skt->family; + hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; addrinfo* r = NULL; @@ -145,7 +157,16 @@ int srs_hijack_io_connect(srs_hijack_io_t ctx, const char* server_ip, int port) if(getaddrinfo(server_ip, sport, (const addrinfo*)&hints, &r)) { return ERROR_SOCKET_CONNECT; } - + + skt->family = r->ai_family; + if (r->ai_family == AF_INET6) { + skt->fd = skt->fdv6; + SOCKET_RESET(skt->fdv6); + } else { + skt->fd = skt->fdv4; + SOCKET_RESET(skt->fdv4); + } + if(::connect(skt->fd, r->ai_addr, r->ai_addrlen) < 0){ return ERROR_SOCKET_CONNECT; } From 20b9d6ab026620cdcc773725169ac745bcea6802 Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 21 Feb 2020 23:51:40 +0800 Subject: [PATCH 2/2] For #1598, support SLB health checking by TCP. 3.0.123 --- README.md | 2 ++ trunk/conf/full.conf | 4 ++++ trunk/src/app/srs_app_caster_flv.cpp | 6 +++++- trunk/src/app/srs_app_config.cpp | 14 +++++++++++++- trunk/src/app/srs_app_config.hpp | 2 ++ trunk/src/app/srs_app_rtsp.cpp | 3 +++ trunk/src/app/srs_app_server.cpp | 4 ++++ trunk/src/core/srs_core_version3.hpp | 2 +- 8 files changed, 34 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4f4ee7545..e72c4e14f 100755 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-02-21, For [#1598][bug #1598], support SLB health checking by TCP. 3.0.123 * v3.0, 2020-02-21, Fix bug for librtmp client ipv4/ipv6 socket. 3.0.122 * v3.0, 2020-02-18, For [#1579][bug #1579], support start/final wait for gracefully quit. 3.0.121 * v3.0, 2020-02-18, For [#1579][bug #1579], support force gracefully quit. 3.0.120 @@ -1656,6 +1657,7 @@ Winlin [bug #1595]: https://github.com/ossrs/srs/issues/1595 [bug #1601]: https://github.com/ossrs/srs/issues/1601 [bug #1579]: https://github.com/ossrs/srs/issues/1579 +[bug #1598]: https://github.com/ossrs/srs/issues/1598 [bug #xxxxxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxxxxx [exo #828]: https://github.com/google/ExoPlayer/pull/828 diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index 65d5ddb48..b56f27fbc 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -72,6 +72,10 @@ work_dir ./; # @reamrk do not support reload. # default: off asprocess off; +# Whether client empty IP is ok, for example, health checking by SLB. +# If ok(on), we will ignore this connection without warnings or errors. +# default: on +empty_ip_ok on; # For gracefully quit, wait for a while then close listeners, # because K8S notify SRS with SIGQUIT and update Service simultaneously, diff --git a/trunk/src/app/srs_app_caster_flv.cpp b/trunk/src/app/srs_app_caster_flv.cpp index 7526921cc..d6f3150f7 100644 --- a/trunk/src/app/srs_app_caster_flv.cpp +++ b/trunk/src/app/srs_app_caster_flv.cpp @@ -76,8 +76,12 @@ srs_error_t SrsAppCasterFlv::initialize() srs_error_t SrsAppCasterFlv::on_tcp_client(srs_netfd_t stfd) { srs_error_t err = srs_success; - + string ip = srs_get_peer_ip(srs_netfd_fileno(stfd)); + if (ip.empty() && !_srs_config->empty_ip_ok()) { + srs_warn("empty ip for fd=%d", srs_netfd_fileno(stfd)); + } + SrsHttpConn* conn = new SrsDynamicHttpConn(this, stfd, http_mux, ip); conns.push_back(conn); diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 3c0af54de..3eb7483a5 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -3488,7 +3488,7 @@ srs_error_t SrsConfig::check_normal_config() && n != "http_server" && n != "stream_caster" && n != "utc_time" && n != "work_dir" && n != "asprocess" && n != "ff_log_level" && n != "grace_final_wait" && n != "force_grace_quit" - && n != "grace_start_wait" + && n != "grace_start_wait" && n != "empty_ip_ok" ) { return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal directive %s", n.c_str()); } @@ -4051,6 +4051,18 @@ bool SrsConfig::get_asprocess() return SRS_CONF_PERFER_FALSE(conf->arg0()); } +bool SrsConfig::empty_ip_ok() +{ + static bool DEFAULT = true; + + SrsConfDirective* conf = root->get("empty_ip_ok"); + if (!conf || conf->arg0().empty()) { + return DEFAULT; + } + + return SRS_CONF_PERFER_TRUE(conf->arg0()); +} + srs_utime_t SrsConfig::get_grace_start_wait() { static srs_utime_t DEFAULT = 2300 * SRS_UTIME_MILLISECONDS; diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index 2bd2882b3..0b94470da 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -468,6 +468,8 @@ public: virtual std::string get_work_dir(); // Whether use asprocess mode. virtual bool get_asprocess(); + // Whether empty client IP is ok. + virtual bool empty_ip_ok(); // Get the start wait in ms for gracefully quit. virtual srs_utime_t get_grace_start_wait(); // Get the final wait in ms for gracefully quit. diff --git a/trunk/src/app/srs_app_rtsp.cpp b/trunk/src/app/srs_app_rtsp.cpp index 051071b49..62ebfdcd1 100644 --- a/trunk/src/app/srs_app_rtsp.cpp +++ b/trunk/src/app/srs_app_rtsp.cpp @@ -243,6 +243,9 @@ srs_error_t SrsRtspConn::do_cycle() // retrieve ip of client. std::string ip = srs_get_peer_ip(srs_netfd_fileno(stfd)); + if (ip.empty() && !_srs_config->empty_ip_ok()) { + srs_warn("empty ip for fd=%d", srs_netfd_fileno(stfd)); + } srs_trace("rtsp: serve %s", ip.c_str()); // consume all rtsp messages. diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index b82cb9197..632ff9fc5 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -1237,6 +1237,10 @@ srs_error_t SrsServer::accept_client(SrsListenerType type, srs_netfd_t stfd) SrsConnection* conn = NULL; if ((err = fd2conn(type, stfd, &conn)) != srs_success) { + if (srs_error_code(err) == ERROR_SOCKET_GET_PEER_IP && _srs_config->empty_ip_ok()) { + srs_close_stfd(stfd); srs_error_reset(err); + return srs_success; + } return srs_error_wrap(err, "fd2conn"); } srs_assert(conn); diff --git a/trunk/src/core/srs_core_version3.hpp b/trunk/src/core/srs_core_version3.hpp index 801fd91fe..c871670b0 100644 --- a/trunk/src/core/srs_core_version3.hpp +++ b/trunk/src/core/srs_core_version3.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION3_HPP #define SRS_CORE_VERSION3_HPP -#define SRS_VERSION3_REVISION 122 +#define SRS_VERSION3_REVISION 123 #endif