int SrsServer::accept_client(SrsListenerType type, st_netfd_t client_stfd) { int ret = ERROR_SUCCESS; int max_connections = _srs_config->get_max_connections(); if ((int)conns.size() >= max_connections) { int fd = st_netfd_fileno(client_stfd); srs_error("exceed the max connections, drop client: " "clients=%d, max=%d, fd=%d", (int)conns.size(), max_connections, fd); srs_close_stfd(client_stfd); return ret; } SrsConnection* conn = NULL; if (type == SrsListenerRtmpStream) { conn = new SrsRtmpConn(this, client_stfd); } else if (type == SrsListenerHttpApi) { #ifdef SRS_AUTO_HTTP_API conn = new SrsHttpApi(this, client_stfd, http_api_handler); #else srs_warn("close http client for server not support http-api"); srs_close_stfd(client_stfd); return ret; #endif } else if (type == SrsListenerHttpStream) { #ifdef SRS_AUTO_HTTP_SERVER conn = new SrsHttpConn(this, client_stfd, http_stream_handler); #else srs_warn("close http client for server not support http-server"); srs_close_stfd(client_stfd); return ret; #endif } else { // TODO: FIXME: handler others } srs_assert(conn); // directly enqueue, the cycle thread will remove the client. conns.push_back(conn); srs_verbose("add conn to vector."); // cycle will start process thread and when finished remove the client. // @remark never use the conn, for it maybe destroyed. if ((ret = conn->start()) != ERROR_SUCCESS) { return ret; } srs_verbose("conn started success."); srs_verbose("accept client finished. conns=%d, ret=%d", (int)conns.size(), ret); return ret; }
SrsListener::~SrsListener() { srs_close_stfd(stfd); pthread->stop(); srs_freep(pthread); // st does not close it sometimes, // close it manually. close(fd); }
SrsSignalManager::~SrsSignalManager() { pthread->stop(); srs_freep(pthread); srs_close_stfd(signal_read_stfd); if (sig_pipe[0] > 0) { ::close(sig_pipe[0]); } if (sig_pipe[1] > 0) { ::close(sig_pipe[1]); } }
void SrsConnection::stop() { srs_close_stfd(stfd); srs_freep(pthread); }
void SrsForwarder::close_underlayer_socket() { srs_close_stfd(stfd); }
void SrsEdgeIngester::close_underlayer_socket() { srs_close_stfd(stfd); }
SrsConnection::~SrsConnection() { srs_close_stfd(stfd); }