From 5b28355a0bf3fd37d00ac11d54de9b0a05a7dcaf Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 6 Aug 2014 09:57:30 +0800 Subject: [PATCH] fix #147, support identify the srs edge. 0.9.190. --- README.md | 1 + trunk/src/app/srs_app_edge.cpp | 47 +++++++++++++++++++++++++++-- trunk/src/app/srs_app_edge.hpp | 1 + trunk/src/app/srs_app_rtmp_conn.cpp | 29 ++++++++++++++++++ trunk/src/core/srs_core.hpp | 2 +- 5 files changed, 77 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6325a0c35..88fb18b02 100755 --- a/README.md +++ b/README.md @@ -208,6 +208,7 @@ Supported operating systems and hardware: * 2013-10-17, Created.
## History +* v1.0, 2014-08-06, fix [#147](https://github.com/winlinvip/simple-rtmp-server/issues/147), support identify the srs edge. 0.9.190. * v1.0, 2014-08-03, [1.0 mainline7(0.9.189)](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0.mainline7) released. 57432 lines. * v1.0, 2014-08-03, fix [#79](https://github.com/winlinvip/simple-rtmp-server/issues/79), fix the reload remove edge assert bug. 0.9.189. * v1.0, 2014-08-03, fix [#57](https://github.com/winlinvip/simple-rtmp-server/issues/57), use lock(acquire/release publish) to avoid duplicated publishing. 0.9.188. diff --git a/trunk/src/app/srs_app_edge.cpp b/trunk/src/app/srs_app_edge.cpp index 549c3d884..cc26d6438 100644 --- a/trunk/src/app/srs_app_edge.cpp +++ b/trunk/src/app/srs_app_edge.cpp @@ -46,6 +46,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +#include // when error, edge ingester sleep for a while and retry. #define SRS_EDGE_INGESTER_SLEEP_US (int64_t)(1*1000*1000LL) @@ -131,8 +132,7 @@ int SrsEdgeIngester::cycle() srs_error("handshake with server failed. ret=%d", ret); return ret; } - if ((ret = client->connect_app(req->app, req->tcUrl, req)) != ERROR_SUCCESS) { - srs_error("connect with server failed, tcUrl=%s. ret=%d", req->tcUrl.c_str(), ret); + if ((ret = connect_app()) != ERROR_SUCCESS) { return ret; } if ((ret = client->create_stream(stream_id)) != ERROR_SUCCESS) { @@ -209,6 +209,49 @@ int SrsEdgeIngester::ingest() return ret; } +int SrsEdgeIngester::connect_app() +{ + int ret = ERROR_SUCCESS; + + SrsRequest* req = _req; + + // args of request takes the srs info. + if (req->args == NULL) { + req->args = SrsAmf0Any::object(); + } + + // notify server the edge identity, + // @see https://github.com/winlinvip/simple-rtmp-server/issues/147 + SrsAmf0Object* data = req->args; + data->set("srs_sig", SrsAmf0Any::str(RTMP_SIG_SRS_KEY)); + data->set("srs_server", SrsAmf0Any::str(RTMP_SIG_SRS_KEY" "RTMP_SIG_SRS_VERSION" ("RTMP_SIG_SRS_URL_SHORT")")); + data->set("srs_license", SrsAmf0Any::str(RTMP_SIG_SRS_LICENSE)); + data->set("srs_role", SrsAmf0Any::str(RTMP_SIG_SRS_ROLE)); + data->set("srs_url", SrsAmf0Any::str(RTMP_SIG_SRS_URL)); + data->set("srs_version", SrsAmf0Any::str(RTMP_SIG_SRS_VERSION)); + data->set("srs_site", SrsAmf0Any::str(RTMP_SIG_SRS_WEB)); + data->set("srs_email", SrsAmf0Any::str(RTMP_SIG_SRS_EMAIL)); + data->set("srs_copyright", SrsAmf0Any::str(RTMP_SIG_SRS_COPYRIGHT)); + data->set("srs_primary_authors", SrsAmf0Any::str(RTMP_SIG_SRS_PRIMARY_AUTHROS)); + // for edge to directly get the id of client. + data->set("srs_pid", SrsAmf0Any::number(getpid())); + data->set("srs_id", SrsAmf0Any::number(_srs_context->get_id())); + + // local ip of edge + std::vector ips = srs_get_local_ipv4_ips(); + assert(_srs_config->get_stats_network() < (int)ips.size()); + std::string local_ip = ips[_srs_config->get_stats_network()]; + data->set("srs_server_ip", SrsAmf0Any::str(local_ip.c_str())); + + // upnode server identity will show in the connect_app of client. + if ((ret = client->connect_app(req->app, req->tcUrl, req)) != ERROR_SUCCESS) { + srs_error("connect with server failed, tcUrl=%s. ret=%d", req->tcUrl.c_str(), ret); + return ret; + } + + return ret; +} + int SrsEdgeIngester::process_publish_message(SrsMessage* msg) { int ret = ERROR_SUCCESS; diff --git a/trunk/src/app/srs_app_edge.hpp b/trunk/src/app/srs_app_edge.hpp index e91f70f80..6e3bad6a1 100644 --- a/trunk/src/app/srs_app_edge.hpp +++ b/trunk/src/app/srs_app_edge.hpp @@ -101,6 +101,7 @@ private: virtual int ingest(); virtual void close_underlayer_socket(); virtual int connect_server(); + virtual int connect_app(); virtual int process_publish_message(SrsMessage* msg); }; diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index 6ea5181fa..5e7997a20 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -163,6 +163,35 @@ int SrsRtmpConn::do_cycle() req->schema.c_str(), req->vhost.c_str(), req->port.c_str(), req->app.c_str(), (req->args? "(obj)":"null")); + // show client identity + if(req->args) { + std::string srs_version; + std::string srs_server_ip; + int srs_pid = 0; + int srs_id = 0; + + SrsAmf0Any* prop = NULL; + if ((prop = req->args->ensure_property_string("srs_version")) != NULL) { + srs_version = prop->to_str(); + } + if ((prop = req->args->ensure_property_string("srs_server_ip")) != NULL) { + srs_server_ip = prop->to_str(); + } + if ((prop = req->args->ensure_property_number("srs_pid")) != NULL) { + srs_pid = (int)prop->to_number(); + } + if ((prop = req->args->ensure_property_number("srs_id")) != NULL) { + srs_id = (int)prop->to_number(); + } + + srs_info("edge-srs ip=%s, version=%s, pid=%d, id=%d", + srs_server_ip.c_str(), srs_version.c_str(), srs_pid, srs_id); + if (srs_pid > 0) { + srs_trace("edge-srs ip=%s, version=%s, pid=%d, id=%d", + srs_server_ip.c_str(), srs_version.c_str(), srs_pid, srs_id); + } + } + ret = service_cycle(); http_hooks_on_close(); diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 2c7a595c9..0a79bd7e8 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR "0" #define VERSION_MINOR "9" -#define VERSION_REVISION "189" +#define VERSION_REVISION "190" #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION // server info. #define RTMP_SIG_SRS_KEY "SRS"