From aeebddb2691b7598d83429bc32ef6c0390f9cea2 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 22 Aug 2015 13:57:34 +0800 Subject: [PATCH] for #442, add more information for client for api. --- trunk/src/app/srs_app_rtmp_conn.cpp | 2 +- trunk/src/app/srs_app_statistic.cpp | 23 ++++++++++++++++++++--- trunk/src/app/srs_app_statistic.hpp | 7 ++++++- trunk/src/protocol/srs_rtmp_stack.cpp | 9 +++++++-- trunk/src/protocol/srs_rtmp_stack.hpp | 1 + trunk/src/protocol/srs_rtmp_utility.cpp | 2 +- 6 files changed, 36 insertions(+), 8 deletions(-) diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index 08423517e8..b4da91406c 100755 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -495,7 +495,7 @@ int SrsRtmpConn::stream_service_cycle() // update the statistic when source disconveried. SrsStatistic* stat = SrsStatistic::instance(); - if ((ret = stat->on_client(_srs_context->get_id(), req, this)) != ERROR_SUCCESS) { + if ((ret = stat->on_client(_srs_context->get_id(), req, this, type)) != ERROR_SUCCESS) { srs_error("stat client failed. ret=%d", ret); return ret; } diff --git a/trunk/src/app/srs_app_statistic.cpp b/trunk/src/app/srs_app_statistic.cpp index dd6983a7ec..2d375b067b 100755 --- a/trunk/src/app/srs_app_statistic.cpp +++ b/trunk/src/app/srs_app_statistic.cpp @@ -181,6 +181,11 @@ void SrsStatisticStream::close() SrsStatisticClient::SrsStatisticClient() { id = 0; + stream = NULL; + conn = NULL; + req = NULL; + type = SrsRtmpConnUnknown; + create = srs_get_system_time_ms(); } SrsStatisticClient::~SrsStatisticClient() @@ -192,7 +197,17 @@ int SrsStatisticClient::dumps(stringstream& ss) int ret = ERROR_SUCCESS; ss << SRS_JOBJECT_START - << SRS_JFIELD_ORG("id", id) + << SRS_JFIELD_ORG("id", id) << SRS_JFIELD_CONT + << SRS_JFIELD_ORG("vhost", stream->vhost->id) << SRS_JFIELD_CONT + << SRS_JFIELD_ORG("stream", stream->id) << SRS_JFIELD_CONT + << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT + << SRS_JFIELD_STR("pageUrl", req->pageUrl) << SRS_JFIELD_CONT + << SRS_JFIELD_STR("swfUrl", req->swfUrl) << SRS_JFIELD_CONT + << SRS_JFIELD_STR("tcUrl", req->tcUrl) << SRS_JFIELD_CONT + << SRS_JFIELD_STR("url", req->get_stream_url()) << SRS_JFIELD_CONT + << SRS_JFIELD_STR("type", srs_client_type_string(type)) << SRS_JFIELD_CONT + << SRS_JFIELD_BOOL("publish", srs_client_type_is_publish(type)) << SRS_JFIELD_CONT + << SRS_JFIELD_ORG("alive", srs_get_system_time_ms() - create) << SRS_JOBJECT_END; return ret; @@ -322,7 +337,7 @@ void SrsStatistic::on_stream_close(SrsRequest* req) stream->close(); } -int SrsStatistic::on_client(int id, SrsRequest* req, SrsConnection* conn) +int SrsStatistic::on_client(int id, SrsRequest* req, SrsConnection* conn, SrsRtmpConnType type) { int ret = ERROR_SUCCESS; @@ -342,6 +357,8 @@ int SrsStatistic::on_client(int id, SrsRequest* req, SrsConnection* conn) // got client. client->conn = conn; + client->req = req; + client->type = type; stream->nb_clients++; vhost->nb_clients++; @@ -464,7 +481,7 @@ int SrsStatistic::dumps_clients(stringstream& ss, int start, int count) ss << SRS_JARRAY_START; std::map::iterator it = clients.begin(); - for (int i = 0; i < count && it != clients.end(); it++) { + for (int i = 0; i < start + count && it != clients.end(); it++, i++) { if (i < start) { continue; } diff --git a/trunk/src/app/srs_app_statistic.hpp b/trunk/src/app/srs_app_statistic.hpp index 3abfc561ed..9505ed4979 100755 --- a/trunk/src/app/srs_app_statistic.hpp +++ b/trunk/src/app/srs_app_statistic.hpp @@ -34,6 +34,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include +#include class SrsKbps; class SrsRequest; @@ -113,7 +114,10 @@ struct SrsStatisticClient public: SrsStatisticStream* stream; SrsConnection* conn; + SrsRequest* req; + SrsRtmpConnType type; int id; + int64_t create; public: SrsStatisticClient(); virtual ~SrsStatisticClient(); @@ -183,8 +187,9 @@ class SrsStatistic * @param id, the client srs id. * @param req, the client request object. * @param conn, the physical absract connection object. + * @param type, the type of connection. */ - virtual int on_client(int id, SrsRequest* req, SrsConnection* conn); + virtual int on_client(int id, SrsRequest* req, SrsConnection* conn, SrsRtmpConnType type); /** * client disconnect * @remark the on_disconnect always call, while the on_client is call when diff --git a/trunk/src/protocol/srs_rtmp_stack.cpp b/trunk/src/protocol/srs_rtmp_stack.cpp index e7d15876d5..277309a62a 100644 --- a/trunk/src/protocol/srs_rtmp_stack.cpp +++ b/trunk/src/protocol/srs_rtmp_stack.cpp @@ -1747,12 +1747,17 @@ string srs_client_type_string(SrsRtmpConnType type) { switch (type) { case SrsRtmpConnPlay: return "Play"; - case SrsRtmpConnFlashPublish: return "publish(FlashPublish)"; - case SrsRtmpConnFMLEPublish: return "publish(FMLEPublish)"; + case SrsRtmpConnFlashPublish: return "flash-publish)"; + case SrsRtmpConnFMLEPublish: return "fmle-publish"; default: return "Unknown"; } } +bool srs_client_type_is_publish(SrsRtmpConnType type) +{ + return type != SrsRtmpConnPlay; +} + SrsHandshakeBytes::SrsHandshakeBytes() { c0c1 = s0s1s2 = c2 = NULL; diff --git a/trunk/src/protocol/srs_rtmp_stack.hpp b/trunk/src/protocol/srs_rtmp_stack.hpp index f2c837fc88..ec50bf78a3 100644 --- a/trunk/src/protocol/srs_rtmp_stack.hpp +++ b/trunk/src/protocol/srs_rtmp_stack.hpp @@ -622,6 +622,7 @@ enum SrsRtmpConnType SrsRtmpConnFlashPublish, }; std::string srs_client_type_string(SrsRtmpConnType type); +bool srs_client_type_is_publish(SrsRtmpConnType type); /** * store the handshake bytes, diff --git a/trunk/src/protocol/srs_rtmp_utility.cpp b/trunk/src/protocol/srs_rtmp_utility.cpp index 4d346ed0c7..c28d5cf325 100644 --- a/trunk/src/protocol/srs_rtmp_utility.cpp +++ b/trunk/src/protocol/srs_rtmp_utility.cpp @@ -247,7 +247,7 @@ int srs_write_large_iovs(ISrsProtocolReaderWriter* skt, iovec* iovs, int size, s // for srs-librtmp, @see https://github.com/simple-rtmp-server/srs/issues/213 #ifndef _WIN32 // for linux, generally it's 1024. - static int limits = sysconf(_SC_IOV_MAX); + static int limits = (int)sysconf(_SC_IOV_MAX); #else static int limits = 1024; #endif