diff --git a/README.md b/README.md index 4ad9691c4..97840fc31 100755 --- a/README.md +++ b/README.md @@ -240,6 +240,7 @@ Supported operating systems and hardware: * 2013-10-17, Created.
## History +* v1.0, 2014-06-19, add connections count to api summaries. 0.9.127 * v1.0, 2014-06-19, add srs bytes and kbps to api summaries. 0.9.126 * v1.0, 2014-06-18, add network bytes to api summaries. 0.9.125 * v1.0, 2014-06-14, fix [#98](https://github.com/winlinvip/simple-rtmp-server/issues/98), workaround for librtmp ping(fmt=1,cid=2 fresh stream). 0.9.124 diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 0140dc983..4d8ec39c6 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -462,7 +462,12 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) << JFIELD_ORG("srs_recv_bytes", nrs->rbytes) << JFIELD_CONT << JFIELD_ORG("srs_recv_kbps", nrs->rkbps) << JFIELD_CONT << JFIELD_ORG("srs_send_bytes", nrs->sbytes) << JFIELD_CONT - << JFIELD_ORG("srs_send_kbps", nrs->skbps) + << JFIELD_ORG("srs_send_kbps", nrs->skbps) << JFIELD_CONT + << JFIELD_ORG("conn_sys", nrs->nb_conn_sys) << JFIELD_CONT + << JFIELD_ORG("conn_sys_et", nrs->nb_conn_sys_et) << JFIELD_CONT + << JFIELD_ORG("conn_sys_tw", nrs->nb_conn_sys_tw) << JFIELD_CONT + << JFIELD_ORG("conn_sys_ls", nrs->nb_conn_sys_ls) << JFIELD_CONT + << JFIELD_ORG("conn_srs", nrs->nb_conn_srs) << JOBJECT_END << JOBJECT_END << JOBJECT_END; diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 025aa1f81..e8a480c44 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -733,7 +733,7 @@ int SrsServer::do_cycle() if ((i % SRS_SYS_NETWORK_RTMP_SERVER_RESOLUTION_TIMES) == 0) { srs_info("update network rtmp server info."); resample_kbps(NULL); - srs_update_rtmp_server(kbps); + srs_update_rtmp_server((int)conns.size(), kbps); } #ifdef SRS_AUTO_HTTP_PARSER if (_srs_config->get_heartbeat_enabled()) { diff --git a/trunk/src/app/srs_app_utility.cpp b/trunk/src/app/srs_app_utility.cpp index 23d658bd0..47b748cb9 100644 --- a/trunk/src/app/srs_app_utility.cpp +++ b/trunk/src/app/srs_app_utility.cpp @@ -528,6 +528,8 @@ SrsNetworkRtmpServer::SrsNetworkRtmpServer() { ok = false; sample_time = rbytes = sbytes = 0; + nb_conn_sys = nb_conn_srs = 0; + nb_conn_sys_et = nb_conn_sys_tw = nb_conn_sys_ls = 0; } static SrsNetworkRtmpServer _srs_network_rtmp_server; @@ -537,23 +539,90 @@ SrsNetworkRtmpServer* srs_get_network_rtmp_server() return &_srs_network_rtmp_server; } -void srs_update_rtmp_server(SrsKbps* kbps) +// @see: http://stackoverflow.com/questions/5992211/list-of-possible-internal-socket-statuses-from-proc +enum { + SYS_TCP_ESTABLISHED = 1, + SYS_TCP_SYN_SENT, + SYS_TCP_SYN_RECV, + SYS_TCP_FIN_WAIT1, + SYS_TCP_FIN_WAIT2, + SYS_TCP_TIME_WAIT, + SYS_TCP_CLOSE, + SYS_TCP_CLOSE_WAIT, + SYS_TCP_LAST_ACK, + SYS_TCP_LISTEN, + SYS_TCP_CLOSING, /* Now a valid state */ + + SYS_TCP_MAX_STATES /* Leave at the end! */ +}; + +void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps) { SrsNetworkRtmpServer& r = _srs_network_rtmp_server; - r.ok = true; + if (true) { + FILE* f = fopen("/proc/net/tcp", "r"); + if (f == NULL) { + srs_warn("open proc network tcp failed, ignore"); + return; + } + + // ignore title. + static char buf[1024]; + fgets(buf, sizeof(buf), f); - r.sample_time = srs_get_system_time_ms(); + int nb_conn_sys_established = 0; + int nb_conn_sys_time_wait = 0; + int nb_conn_sys_listen = 0; + int nb_conn_sys_other = 0; + for (;;) { + int st = 0; + + int ret = fscanf(f, "%*s %*s %*s %2x\n", &st); + // ignore to end. + fgets(buf, sizeof(buf), f); + + if (ret == 1) { + if (st == SYS_TCP_ESTABLISHED) { + nb_conn_sys_established++; + } else if (st == SYS_TCP_TIME_WAIT) { + nb_conn_sys_time_wait++; + } else if (st == SYS_TCP_LISTEN) { + nb_conn_sys_listen++; + } else { + nb_conn_sys_other++; + } + } + + if (ret == EOF) { + break; + } + } + + r.nb_conn_sys = nb_conn_sys_established + nb_conn_sys_time_wait + nb_conn_sys_listen + nb_conn_sys_other; + r.nb_conn_sys_et = nb_conn_sys_established; + r.nb_conn_sys_tw = nb_conn_sys_time_wait; + r.nb_conn_sys_ls = nb_conn_sys_listen; - r.rbytes = kbps->get_recv_bytes(); - r.rkbps = kbps->get_recv_kbps(); - r.rkbps_30s = kbps->get_recv_kbps_30s(); - r.rkbps_5m = kbps->get_recv_kbps_5m(); + fclose(f); + } - r.sbytes = kbps->get_send_bytes(); - r.skbps = kbps->get_send_kbps(); - r.skbps_30s = kbps->get_send_kbps_30s(); - r.skbps_5m = kbps->get_send_kbps_5m(); + if (true) { + r.ok = true; + + r.nb_conn_srs = nb_conn; + r.sample_time = srs_get_system_time_ms(); + + r.rbytes = kbps->get_recv_bytes(); + r.rkbps = kbps->get_recv_kbps(); + r.rkbps_30s = kbps->get_recv_kbps_30s(); + r.rkbps_5m = kbps->get_recv_kbps_5m(); + + r.sbytes = kbps->get_send_bytes(); + r.skbps = kbps->get_send_kbps(); + r.skbps_30s = kbps->get_send_kbps_30s(); + r.skbps_5m = kbps->get_send_kbps_5m(); + } } vector _srs_system_ipv4_ips; diff --git a/trunk/src/app/srs_app_utility.hpp b/trunk/src/app/srs_app_utility.hpp index dedfc6a53..abd1f2a47 100644 --- a/trunk/src/app/srs_app_utility.hpp +++ b/trunk/src/app/srs_app_utility.hpp @@ -414,13 +414,20 @@ public: int skbps_30s; int skbps_5m; + // connections + int nb_conn_sys; + int nb_conn_sys_et; // established + int nb_conn_sys_tw; // time wait + int nb_conn_sys_ls; // listen + int nb_conn_srs; + SrsNetworkRtmpServer(); }; // get network devices info, use cache to avoid performance problem. extern SrsNetworkRtmpServer* srs_get_network_rtmp_server(); // the deamon st-thread will update it. -extern void srs_update_rtmp_server(SrsKbps* kbps); +extern void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps); // get local ip, fill to @param ips extern void srs_retrieve_local_ipv4_ips(); diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 9bc6d3c57..547ce466b 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 "126" +#define VERSION_REVISION "127" #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION // server info. #define RTMP_SIG_SRS_KEY "SRS"