winlin

for #442, add more information for client for api.

@@ -495,7 +495,7 @@ int SrsRtmpConn::stream_service_cycle() @@ -495,7 +495,7 @@ int SrsRtmpConn::stream_service_cycle()
495 495
496 // update the statistic when source disconveried. 496 // update the statistic when source disconveried.
497 SrsStatistic* stat = SrsStatistic::instance(); 497 SrsStatistic* stat = SrsStatistic::instance();
498 - if ((ret = stat->on_client(_srs_context->get_id(), req, this)) != ERROR_SUCCESS) { 498 + if ((ret = stat->on_client(_srs_context->get_id(), req, this, type)) != ERROR_SUCCESS) {
499 srs_error("stat client failed. ret=%d", ret); 499 srs_error("stat client failed. ret=%d", ret);
500 return ret; 500 return ret;
501 } 501 }
@@ -181,6 +181,11 @@ void SrsStatisticStream::close() @@ -181,6 +181,11 @@ void SrsStatisticStream::close()
181 SrsStatisticClient::SrsStatisticClient() 181 SrsStatisticClient::SrsStatisticClient()
182 { 182 {
183 id = 0; 183 id = 0;
  184 + stream = NULL;
  185 + conn = NULL;
  186 + req = NULL;
  187 + type = SrsRtmpConnUnknown;
  188 + create = srs_get_system_time_ms();
184 } 189 }
185 190
186 SrsStatisticClient::~SrsStatisticClient() 191 SrsStatisticClient::~SrsStatisticClient()
@@ -192,7 +197,17 @@ int SrsStatisticClient::dumps(stringstream& ss) @@ -192,7 +197,17 @@ int SrsStatisticClient::dumps(stringstream& ss)
192 int ret = ERROR_SUCCESS; 197 int ret = ERROR_SUCCESS;
193 198
194 ss << SRS_JOBJECT_START 199 ss << SRS_JOBJECT_START
195 - << SRS_JFIELD_ORG("id", id) 200 + << SRS_JFIELD_ORG("id", id) << SRS_JFIELD_CONT
  201 + << SRS_JFIELD_ORG("vhost", stream->vhost->id) << SRS_JFIELD_CONT
  202 + << SRS_JFIELD_ORG("stream", stream->id) << SRS_JFIELD_CONT
  203 + << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT
  204 + << SRS_JFIELD_STR("pageUrl", req->pageUrl) << SRS_JFIELD_CONT
  205 + << SRS_JFIELD_STR("swfUrl", req->swfUrl) << SRS_JFIELD_CONT
  206 + << SRS_JFIELD_STR("tcUrl", req->tcUrl) << SRS_JFIELD_CONT
  207 + << SRS_JFIELD_STR("url", req->get_stream_url()) << SRS_JFIELD_CONT
  208 + << SRS_JFIELD_STR("type", srs_client_type_string(type)) << SRS_JFIELD_CONT
  209 + << SRS_JFIELD_BOOL("publish", srs_client_type_is_publish(type)) << SRS_JFIELD_CONT
  210 + << SRS_JFIELD_ORG("alive", srs_get_system_time_ms() - create)
196 << SRS_JOBJECT_END; 211 << SRS_JOBJECT_END;
197 212
198 return ret; 213 return ret;
@@ -322,7 +337,7 @@ void SrsStatistic::on_stream_close(SrsRequest* req) @@ -322,7 +337,7 @@ void SrsStatistic::on_stream_close(SrsRequest* req)
322 stream->close(); 337 stream->close();
323 } 338 }
324 339
325 -int SrsStatistic::on_client(int id, SrsRequest* req, SrsConnection* conn) 340 +int SrsStatistic::on_client(int id, SrsRequest* req, SrsConnection* conn, SrsRtmpConnType type)
326 { 341 {
327 int ret = ERROR_SUCCESS; 342 int ret = ERROR_SUCCESS;
328 343
@@ -342,6 +357,8 @@ int SrsStatistic::on_client(int id, SrsRequest* req, SrsConnection* conn) @@ -342,6 +357,8 @@ int SrsStatistic::on_client(int id, SrsRequest* req, SrsConnection* conn)
342 357
343 // got client. 358 // got client.
344 client->conn = conn; 359 client->conn = conn;
  360 + client->req = req;
  361 + client->type = type;
345 stream->nb_clients++; 362 stream->nb_clients++;
346 vhost->nb_clients++; 363 vhost->nb_clients++;
347 364
@@ -464,7 +481,7 @@ int SrsStatistic::dumps_clients(stringstream& ss, int start, int count) @@ -464,7 +481,7 @@ int SrsStatistic::dumps_clients(stringstream& ss, int start, int count)
464 481
465 ss << SRS_JARRAY_START; 482 ss << SRS_JARRAY_START;
466 std::map<int, SrsStatisticClient*>::iterator it = clients.begin(); 483 std::map<int, SrsStatisticClient*>::iterator it = clients.begin();
467 - for (int i = 0; i < count && it != clients.end(); it++) { 484 + for (int i = 0; i < start + count && it != clients.end(); it++, i++) {
468 if (i < start) { 485 if (i < start) {
469 continue; 486 continue;
470 } 487 }
@@ -34,6 +34,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -34,6 +34,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 #include <string> 34 #include <string>
35 35
36 #include <srs_kernel_codec.hpp> 36 #include <srs_kernel_codec.hpp>
  37 +#include <srs_rtmp_stack.hpp>
37 38
38 class SrsKbps; 39 class SrsKbps;
39 class SrsRequest; 40 class SrsRequest;
@@ -113,7 +114,10 @@ struct SrsStatisticClient @@ -113,7 +114,10 @@ struct SrsStatisticClient
113 public: 114 public:
114 SrsStatisticStream* stream; 115 SrsStatisticStream* stream;
115 SrsConnection* conn; 116 SrsConnection* conn;
  117 + SrsRequest* req;
  118 + SrsRtmpConnType type;
116 int id; 119 int id;
  120 + int64_t create;
117 public: 121 public:
118 SrsStatisticClient(); 122 SrsStatisticClient();
119 virtual ~SrsStatisticClient(); 123 virtual ~SrsStatisticClient();
@@ -183,8 +187,9 @@ public: @@ -183,8 +187,9 @@ public:
183 * @param id, the client srs id. 187 * @param id, the client srs id.
184 * @param req, the client request object. 188 * @param req, the client request object.
185 * @param conn, the physical absract connection object. 189 * @param conn, the physical absract connection object.
  190 + * @param type, the type of connection.
186 */ 191 */
187 - virtual int on_client(int id, SrsRequest* req, SrsConnection* conn); 192 + virtual int on_client(int id, SrsRequest* req, SrsConnection* conn, SrsRtmpConnType type);
188 /** 193 /**
189 * client disconnect 194 * client disconnect
190 * @remark the on_disconnect always call, while the on_client is call when 195 * @remark the on_disconnect always call, while the on_client is call when
@@ -1747,12 +1747,17 @@ string srs_client_type_string(SrsRtmpConnType type) @@ -1747,12 +1747,17 @@ string srs_client_type_string(SrsRtmpConnType type)
1747 { 1747 {
1748 switch (type) { 1748 switch (type) {
1749 case SrsRtmpConnPlay: return "Play"; 1749 case SrsRtmpConnPlay: return "Play";
1750 - case SrsRtmpConnFlashPublish: return "publish(FlashPublish)";  
1751 - case SrsRtmpConnFMLEPublish: return "publish(FMLEPublish)"; 1750 + case SrsRtmpConnFlashPublish: return "flash-publish)";
  1751 + case SrsRtmpConnFMLEPublish: return "fmle-publish";
1752 default: return "Unknown"; 1752 default: return "Unknown";
1753 } 1753 }
1754 } 1754 }
1755 1755
  1756 +bool srs_client_type_is_publish(SrsRtmpConnType type)
  1757 +{
  1758 + return type != SrsRtmpConnPlay;
  1759 +}
  1760 +
1756 SrsHandshakeBytes::SrsHandshakeBytes() 1761 SrsHandshakeBytes::SrsHandshakeBytes()
1757 { 1762 {
1758 c0c1 = s0s1s2 = c2 = NULL; 1763 c0c1 = s0s1s2 = c2 = NULL;
@@ -622,6 +622,7 @@ enum SrsRtmpConnType @@ -622,6 +622,7 @@ enum SrsRtmpConnType
622 SrsRtmpConnFlashPublish, 622 SrsRtmpConnFlashPublish,
623 }; 623 };
624 std::string srs_client_type_string(SrsRtmpConnType type); 624 std::string srs_client_type_string(SrsRtmpConnType type);
  625 +bool srs_client_type_is_publish(SrsRtmpConnType type);
625 626
626 /** 627 /**
627 * store the handshake bytes, 628 * store the handshake bytes,
@@ -247,7 +247,7 @@ int srs_write_large_iovs(ISrsProtocolReaderWriter* skt, iovec* iovs, int size, s @@ -247,7 +247,7 @@ int srs_write_large_iovs(ISrsProtocolReaderWriter* skt, iovec* iovs, int size, s
247 // for srs-librtmp, @see https://github.com/simple-rtmp-server/srs/issues/213 247 // for srs-librtmp, @see https://github.com/simple-rtmp-server/srs/issues/213
248 #ifndef _WIN32 248 #ifndef _WIN32
249 // for linux, generally it's 1024. 249 // for linux, generally it's 1024.
250 - static int limits = sysconf(_SC_IOV_MAX); 250 + static int limits = (int)sysconf(_SC_IOV_MAX);
251 #else 251 #else
252 static int limits = 1024; 252 static int limits = 1024;
253 #endif 253 #endif