正在显示
2 个修改的文件
包含
109 行增加
和
59 行删除
| @@ -48,14 +48,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -48,14 +48,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 48 | #define SERVER_LISTEN_BACKLOG 512 | 48 | #define SERVER_LISTEN_BACKLOG 512 |
| 49 | #define SRS_TIME_RESOLUTION_MS 500 | 49 | #define SRS_TIME_RESOLUTION_MS 500 |
| 50 | 50 | ||
| 51 | -SrsListener::SrsListener(SrsServer* _server, SrsListenerType _type) | 51 | +SrsListener::SrsListener(SrsServer* server, SrsListenerType type) |
| 52 | { | 52 | { |
| 53 | fd = -1; | 53 | fd = -1; |
| 54 | stfd = NULL; | 54 | stfd = NULL; |
| 55 | 55 | ||
| 56 | - port = 0; | ||
| 57 | - server = _server; | ||
| 58 | - type = _type; | 56 | + _port = 0; |
| 57 | + _server = server; | ||
| 58 | + _type = type; | ||
| 59 | 59 | ||
| 60 | pthread = new SrsThread(this, 0); | 60 | pthread = new SrsThread(this, 0); |
| 61 | } | 61 | } |
| @@ -72,11 +72,16 @@ SrsListener::~SrsListener() | @@ -72,11 +72,16 @@ SrsListener::~SrsListener() | ||
| 72 | close(fd); | 72 | close(fd); |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | -int SrsListener::listen(int _port) | 75 | +SrsListenerType SrsListener::type() |
| 76 | +{ | ||
| 77 | + return _type; | ||
| 78 | +} | ||
| 79 | + | ||
| 80 | +int SrsListener::listen(int port) | ||
| 76 | { | 81 | { |
| 77 | int ret = ERROR_SUCCESS; | 82 | int ret = ERROR_SUCCESS; |
| 78 | 83 | ||
| 79 | - port = _port; | 84 | + _port = port; |
| 80 | 85 | ||
| 81 | if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { | 86 | if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { |
| 82 | ret = ERROR_SOCKET_CREATE; | 87 | ret = ERROR_SOCKET_CREATE; |
| @@ -95,7 +100,7 @@ int SrsListener::listen(int _port) | @@ -95,7 +100,7 @@ int SrsListener::listen(int _port) | ||
| 95 | 100 | ||
| 96 | sockaddr_in addr; | 101 | sockaddr_in addr; |
| 97 | addr.sin_family = AF_INET; | 102 | addr.sin_family = AF_INET; |
| 98 | - addr.sin_port = htons(port); | 103 | + addr.sin_port = htons(_port); |
| 99 | addr.sin_addr.s_addr = INADDR_ANY; | 104 | addr.sin_addr.s_addr = INADDR_ANY; |
| 100 | if (bind(fd, (const sockaddr*)&addr, sizeof(sockaddr_in)) == -1) { | 105 | if (bind(fd, (const sockaddr*)&addr, sizeof(sockaddr_in)) == -1) { |
| 101 | ret = ERROR_SOCKET_BIND; | 106 | ret = ERROR_SOCKET_BIND; |
| @@ -124,14 +129,14 @@ int SrsListener::listen(int _port) | @@ -124,14 +129,14 @@ int SrsListener::listen(int _port) | ||
| 124 | } | 129 | } |
| 125 | srs_verbose("create st listen thread success."); | 130 | srs_verbose("create st listen thread success."); |
| 126 | 131 | ||
| 127 | - srs_trace("server started, listen at port=%d, type=%d, fd=%d", port, type, fd); | 132 | + srs_trace("server started, listen at port=%d, type=%d, fd=%d", _port, _type, fd); |
| 128 | 133 | ||
| 129 | return ret; | 134 | return ret; |
| 130 | } | 135 | } |
| 131 | 136 | ||
| 132 | void SrsListener::on_thread_start() | 137 | void SrsListener::on_thread_start() |
| 133 | { | 138 | { |
| 134 | - srs_trace("listen cycle start, port=%d, type=%d, fd=%d", port, type, fd); | 139 | + srs_trace("listen cycle start, port=%d, type=%d, fd=%d", _port, _type, fd); |
| 135 | } | 140 | } |
| 136 | 141 | ||
| 137 | int SrsListener::cycle() | 142 | int SrsListener::cycle() |
| @@ -147,7 +152,7 @@ int SrsListener::cycle() | @@ -147,7 +152,7 @@ int SrsListener::cycle() | ||
| 147 | } | 152 | } |
| 148 | srs_verbose("get a client. fd=%d", st_netfd_fileno(client_stfd)); | 153 | srs_verbose("get a client. fd=%d", st_netfd_fileno(client_stfd)); |
| 149 | 154 | ||
| 150 | - if ((ret = server->accept_client(type, client_stfd)) != ERROR_SUCCESS) { | 155 | + if ((ret = _server->accept_client(_type, client_stfd)) != ERROR_SUCCESS) { |
| 151 | srs_warn("accept client error. ret=%d", ret); | 156 | srs_warn("accept client error. ret=%d", ret); |
| 152 | return ret; | 157 | return ret; |
| 153 | } | 158 | } |
| @@ -188,7 +193,9 @@ SrsServer::~SrsServer() | @@ -188,7 +193,9 @@ SrsServer::~SrsServer() | ||
| 188 | conns.clear(); | 193 | conns.clear(); |
| 189 | } | 194 | } |
| 190 | 195 | ||
| 191 | - close_listeners(); | 196 | + close_listeners(SrsListenerRtmpStream); |
| 197 | + close_listeners(SrsListenerHttpApi); | ||
| 198 | + close_listeners(SrsListenerHttpStream); | ||
| 192 | 199 | ||
| 193 | if (pid_fd > 0) { | 200 | if (pid_fd > 0) { |
| 194 | ::close(pid_fd); | 201 | ::close(pid_fd); |
| @@ -351,50 +358,17 @@ int SrsServer::listen() | @@ -351,50 +358,17 @@ int SrsServer::listen() | ||
| 351 | { | 358 | { |
| 352 | int ret = ERROR_SUCCESS; | 359 | int ret = ERROR_SUCCESS; |
| 353 | 360 | ||
| 354 | - SrsConfDirective* conf = NULL; | ||
| 355 | - | ||
| 356 | - // stream service port. | ||
| 357 | - conf = _srs_config->get_listen(); | ||
| 358 | - srs_assert(conf); | ||
| 359 | - | ||
| 360 | - close_listeners(); | ||
| 361 | - | ||
| 362 | - for (int i = 0; i < (int)conf->args.size(); i++) { | ||
| 363 | - SrsListener* listener = new SrsListener(this, SrsListenerRtmpStream); | ||
| 364 | - listeners.push_back(listener); | ||
| 365 | - | ||
| 366 | - int port = ::atoi(conf->args.at(i).c_str()); | ||
| 367 | - if ((ret = listener->listen(port)) != ERROR_SUCCESS) { | ||
| 368 | - srs_error("RTMP stream listen at port %d failed. ret=%d", port, ret); | ||
| 369 | - return ret; | ||
| 370 | - } | 361 | + if ((ret = listen_rtmp()) != ERROR_SUCCESS) { |
| 362 | + return ret; | ||
| 371 | } | 363 | } |
| 372 | - | ||
| 373 | -#ifdef SRS_HTTP_API | ||
| 374 | - if (_srs_config->get_http_api_enabled()) { | ||
| 375 | - SrsListener* listener = new SrsListener(this, SrsListenerHttpApi); | ||
| 376 | - listeners.push_back(listener); | ||
| 377 | - | ||
| 378 | - int port = _srs_config->get_http_api_listen(); | ||
| 379 | - if ((ret = listener->listen(port)) != ERROR_SUCCESS) { | ||
| 380 | - srs_error("HTTP api listen at port %d failed. ret=%d", port, ret); | ||
| 381 | - return ret; | ||
| 382 | - } | 364 | + |
| 365 | + if ((ret = listen_http_api()) != ERROR_SUCCESS) { | ||
| 366 | + return ret; | ||
| 383 | } | 367 | } |
| 384 | -#endif | ||
| 385 | 368 | ||
| 386 | -#ifdef SRS_HTTP_SERVER | ||
| 387 | - if (_srs_config->get_http_stream_enabled()) { | ||
| 388 | - SrsListener* listener = new SrsListener(this, SrsListenerHttpStream); | ||
| 389 | - listeners.push_back(listener); | ||
| 390 | - | ||
| 391 | - int port = _srs_config->get_http_stream_listen(); | ||
| 392 | - if ((ret = listener->listen(port)) != ERROR_SUCCESS) { | ||
| 393 | - srs_error("HTTP stream listen at port %d failed. ret=%d", port, ret); | ||
| 394 | - return ret; | ||
| 395 | - } | 369 | + if ((ret = listen_http_stream()) != ERROR_SUCCESS) { |
| 370 | + return ret; | ||
| 396 | } | 371 | } |
| 397 | -#endif | ||
| 398 | 372 | ||
| 399 | return ret; | 373 | return ret; |
| 400 | } | 374 | } |
| @@ -492,14 +466,86 @@ void SrsServer::on_signal(int signo) | @@ -492,14 +466,86 @@ void SrsServer::on_signal(int signo) | ||
| 492 | } | 466 | } |
| 493 | } | 467 | } |
| 494 | 468 | ||
| 495 | -void SrsServer::close_listeners() | 469 | +int SrsServer::listen_rtmp() |
| 470 | +{ | ||
| 471 | + int ret = ERROR_SUCCESS; | ||
| 472 | + | ||
| 473 | + // stream service port. | ||
| 474 | + SrsConfDirective* conf = _srs_config->get_listen(); | ||
| 475 | + srs_assert(conf); | ||
| 476 | + | ||
| 477 | + close_listeners(SrsListenerRtmpStream); | ||
| 478 | + | ||
| 479 | + for (int i = 0; i < (int)conf->args.size(); i++) { | ||
| 480 | + SrsListener* listener = new SrsListener(this, SrsListenerRtmpStream); | ||
| 481 | + listeners.push_back(listener); | ||
| 482 | + | ||
| 483 | + int port = ::atoi(conf->args.at(i).c_str()); | ||
| 484 | + if ((ret = listener->listen(port)) != ERROR_SUCCESS) { | ||
| 485 | + srs_error("RTMP stream listen at port %d failed. ret=%d", port, ret); | ||
| 486 | + return ret; | ||
| 487 | + } | ||
| 488 | + } | ||
| 489 | + | ||
| 490 | + return ret; | ||
| 491 | +} | ||
| 492 | + | ||
| 493 | +int SrsServer::listen_http_api() | ||
| 494 | +{ | ||
| 495 | + int ret = ERROR_SUCCESS; | ||
| 496 | + | ||
| 497 | +#ifdef SRS_HTTP_API | ||
| 498 | + close_listeners(SrsListenerHttpApi); | ||
| 499 | + if (_srs_config->get_http_api_enabled()) { | ||
| 500 | + SrsListener* listener = new SrsListener(this, SrsListenerHttpApi); | ||
| 501 | + listeners.push_back(listener); | ||
| 502 | + | ||
| 503 | + int port = _srs_config->get_http_api_listen(); | ||
| 504 | + if ((ret = listener->listen(port)) != ERROR_SUCCESS) { | ||
| 505 | + srs_error("HTTP api listen at port %d failed. ret=%d", port, ret); | ||
| 506 | + return ret; | ||
| 507 | + } | ||
| 508 | + } | ||
| 509 | +#endif | ||
| 510 | + | ||
| 511 | + return ret; | ||
| 512 | +} | ||
| 513 | + | ||
| 514 | +int SrsServer::listen_http_stream() | ||
| 515 | +{ | ||
| 516 | + int ret = ERROR_SUCCESS; | ||
| 517 | + | ||
| 518 | +#ifdef SRS_HTTP_SERVER | ||
| 519 | + close_listeners(SrsListenerHttpStream); | ||
| 520 | + if (_srs_config->get_http_stream_enabled()) { | ||
| 521 | + SrsListener* listener = new SrsListener(this, SrsListenerHttpStream); | ||
| 522 | + listeners.push_back(listener); | ||
| 523 | + | ||
| 524 | + int port = _srs_config->get_http_stream_listen(); | ||
| 525 | + if ((ret = listener->listen(port)) != ERROR_SUCCESS) { | ||
| 526 | + srs_error("HTTP stream listen at port %d failed. ret=%d", port, ret); | ||
| 527 | + return ret; | ||
| 528 | + } | ||
| 529 | + } | ||
| 530 | +#endif | ||
| 531 | + | ||
| 532 | + return ret; | ||
| 533 | +} | ||
| 534 | + | ||
| 535 | +void SrsServer::close_listeners(SrsListenerType type) | ||
| 496 | { | 536 | { |
| 497 | std::vector<SrsListener*>::iterator it; | 537 | std::vector<SrsListener*>::iterator it; |
| 498 | - for (it = listeners.begin(); it != listeners.end(); ++it) { | 538 | + for (it = listeners.begin(); it != listeners.end();) { |
| 499 | SrsListener* listener = *it; | 539 | SrsListener* listener = *it; |
| 540 | + | ||
| 541 | + if (listener->type() != type) { | ||
| 542 | + ++it; | ||
| 543 | + continue; | ||
| 544 | + } | ||
| 545 | + | ||
| 500 | srs_freep(listener); | 546 | srs_freep(listener); |
| 547 | + it = listeners.erase(it); | ||
| 501 | } | 548 | } |
| 502 | - listeners.clear(); | ||
| 503 | } | 549 | } |
| 504 | 550 | ||
| 505 | int SrsServer::accept_client(SrsListenerType type, st_netfd_t client_stfd) | 551 | int SrsServer::accept_client(SrsListenerType type, st_netfd_t client_stfd) |
| @@ -56,17 +56,18 @@ enum SrsListenerType | @@ -56,17 +56,18 @@ enum SrsListenerType | ||
| 56 | class SrsListener : public ISrsThreadHandler | 56 | class SrsListener : public ISrsThreadHandler |
| 57 | { | 57 | { |
| 58 | public: | 58 | public: |
| 59 | - SrsListenerType type; | 59 | + SrsListenerType _type; |
| 60 | private: | 60 | private: |
| 61 | int fd; | 61 | int fd; |
| 62 | st_netfd_t stfd; | 62 | st_netfd_t stfd; |
| 63 | - int port; | ||
| 64 | - SrsServer* server; | 63 | + int _port; |
| 64 | + SrsServer* _server; | ||
| 65 | SrsThread* pthread; | 65 | SrsThread* pthread; |
| 66 | public: | 66 | public: |
| 67 | - SrsListener(SrsServer* _server, SrsListenerType _type); | 67 | + SrsListener(SrsServer* _server, SrsListenerType type); |
| 68 | virtual ~SrsListener(); | 68 | virtual ~SrsListener(); |
| 69 | public: | 69 | public: |
| 70 | + virtual SrsListenerType type(); | ||
| 70 | virtual int listen(int port); | 71 | virtual int listen(int port); |
| 71 | // interface ISrsThreadHandler. | 72 | // interface ISrsThreadHandler. |
| 72 | public: | 73 | public: |
| @@ -106,7 +107,10 @@ public: | @@ -106,7 +107,10 @@ public: | ||
| 106 | virtual void remove(SrsConnection* conn); | 107 | virtual void remove(SrsConnection* conn); |
| 107 | virtual void on_signal(int signo); | 108 | virtual void on_signal(int signo); |
| 108 | private: | 109 | private: |
| 109 | - virtual void close_listeners(); | 110 | + virtual int listen_rtmp(); |
| 111 | + virtual int listen_http_api(); | ||
| 112 | + virtual int listen_http_stream(); | ||
| 113 | + virtual void close_listeners(SrsListenerType type); | ||
| 110 | virtual int accept_client(SrsListenerType type, st_netfd_t client_stfd); | 114 | virtual int accept_client(SrsListenerType type, st_netfd_t client_stfd); |
| 111 | // interface ISrsThreadHandler. | 115 | // interface ISrsThreadHandler. |
| 112 | public: | 116 | public: |
-
请 注册 或 登录 后发表评论