|
|
|
@ -139,9 +139,9 @@ SrsBufferListener::~SrsBufferListener()
|
|
|
|
|
srs_freep(listener);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SrsBufferListener::listen(string i, int p)
|
|
|
|
|
srs_error_t SrsBufferListener::listen(string i, int p)
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
|
|
|
|
|
ip = i;
|
|
|
|
|
port = p;
|
|
|
|
@ -149,30 +149,25 @@ int SrsBufferListener::listen(string i, int p)
|
|
|
|
|
srs_freep(listener);
|
|
|
|
|
listener = new SrsTcpListener(this, ip, port);
|
|
|
|
|
|
|
|
|
|
if ((ret = listener->listen()) != ERROR_SUCCESS) {
|
|
|
|
|
srs_error("tcp listen failed. ret=%d", ret);
|
|
|
|
|
return ret;
|
|
|
|
|
if ((err = listener->listen()) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "buffer tcp listen %s:%d", ip.c_str(), port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_info("listen thread current_cid=%d, "
|
|
|
|
|
"listen at port=%d, type=%d, fd=%d started success, ep=%s:%d",
|
|
|
|
|
_srs_context->get_id(), p, type, listener->fd(), i.c_str(), p);
|
|
|
|
|
string v = srs_listener_type2string(type);
|
|
|
|
|
srs_trace("%s listen at tcp://%s:%d, fd=%d", v.c_str(), ip.c_str(), port, listener->fd());
|
|
|
|
|
|
|
|
|
|
srs_trace("%s listen at tcp://%s:%d, fd=%d", srs_listener_type2string(type).c_str(), ip.c_str(), port, listener->fd());
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SrsBufferListener::on_tcp_client(srs_netfd_t stfd)
|
|
|
|
|
srs_error_t SrsBufferListener::on_tcp_client(srs_netfd_t stfd)
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
|
|
|
|
|
if ((ret = server->accept_client(type, stfd)) != ERROR_SUCCESS) {
|
|
|
|
|
srs_warn("accept client error. ret=%d", ret);
|
|
|
|
|
return ret;
|
|
|
|
|
srs_error_t err = server->accept_client(type, stfd);
|
|
|
|
|
if (err != srs_success) {
|
|
|
|
|
srs_warn("accept client failed, err is %s", srs_error_desc(err).c_str());
|
|
|
|
|
srs_freep(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
return srs_success;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef SRS_AUTO_STREAM_CASTER
|
|
|
|
@ -194,9 +189,9 @@ SrsRtspListener::~SrsRtspListener()
|
|
|
|
|
srs_freep(listener);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SrsRtspListener::listen(string i, int p)
|
|
|
|
|
srs_error_t SrsRtspListener::listen(string i, int p)
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
|
|
|
|
|
// the caller already ensure the type is ok,
|
|
|
|
|
// we just assert here for unknown stream caster.
|
|
|
|
@ -208,27 +203,25 @@ int SrsRtspListener::listen(string i, int p)
|
|
|
|
|
srs_freep(listener);
|
|
|
|
|
listener = new SrsTcpListener(this, ip, port);
|
|
|
|
|
|
|
|
|
|
if ((ret = listener->listen()) != ERROR_SUCCESS) {
|
|
|
|
|
srs_error("rtsp caster listen failed. ret=%d", ret);
|
|
|
|
|
return ret;
|
|
|
|
|
if ((err = listener->listen()) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "rtsp listen %s:%d", ip.c_str(), port);
|
|
|
|
|
}
|
|
|
|
|
srs_info("listen thread listen at port=%d, type=%d, fd=%d started success, ep=%s:%d", port, type, listener->fd(), ip.c_str(), port);
|
|
|
|
|
|
|
|
|
|
srs_trace("%s listen at tcp://%s:%d, fd=%d", srs_listener_type2string(type).c_str(), ip.c_str(), port, listener->fd());
|
|
|
|
|
string v = srs_listener_type2string(type);
|
|
|
|
|
srs_trace("%s listen at tcp://%s:%d, fd=%d", v.c_str(), ip.c_str(), port, listener->fd());
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SrsRtspListener::on_tcp_client(srs_netfd_t stfd)
|
|
|
|
|
srs_error_t SrsRtspListener::on_tcp_client(srs_netfd_t stfd)
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
|
|
|
|
|
if ((ret = caster->on_tcp_client(stfd)) != ERROR_SUCCESS) {
|
|
|
|
|
srs_warn("accept client error. ret=%d", ret);
|
|
|
|
|
return ret;
|
|
|
|
|
srs_error_t err = caster->on_tcp_client(stfd);
|
|
|
|
|
if (err != srs_success) {
|
|
|
|
|
srs_warn("accept client failed, err is %s", srs_error_desc(err).c_str());
|
|
|
|
|
srs_freep(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
return srs_success;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SrsHttpFlvListener::SrsHttpFlvListener(SrsServer* svr, SrsListenerType t, SrsConfDirective* c) : SrsListener(svr, t)
|
|
|
|
@ -249,9 +242,9 @@ SrsHttpFlvListener::~SrsHttpFlvListener()
|
|
|
|
|
srs_freep(listener);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SrsHttpFlvListener::listen(string i, int p)
|
|
|
|
|
srs_error_t SrsHttpFlvListener::listen(string i, int p)
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
|
|
|
|
|
// the caller already ensure the type is ok,
|
|
|
|
|
// we just assert here for unknown stream caster.
|
|
|
|
@ -260,35 +253,32 @@ int SrsHttpFlvListener::listen(string i, int p)
|
|
|
|
|
ip = i;
|
|
|
|
|
port = p;
|
|
|
|
|
|
|
|
|
|
if ((ret = caster->initialize()) != ERROR_SUCCESS) {
|
|
|
|
|
return ret;
|
|
|
|
|
if ((err = caster->initialize()) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "init caster %s:%d", ip.c_str(), port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_freep(listener);
|
|
|
|
|
listener = new SrsTcpListener(this, ip, port);
|
|
|
|
|
|
|
|
|
|
if ((ret = listener->listen()) != ERROR_SUCCESS) {
|
|
|
|
|
srs_error("flv caster listen failed. ret=%d", ret);
|
|
|
|
|
return ret;
|
|
|
|
|
if ((err = listener->listen()) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "listen");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_info("listen thread listen at port=%d, type=%d, fd=%d started success, ep=%s:%d", port, type, listener->fd(), ip.c_str(), port);
|
|
|
|
|
|
|
|
|
|
srs_trace("%s listen at tcp://%s:%d, fd=%d", srs_listener_type2string(type).c_str(), ip.c_str(), port, listener->fd());
|
|
|
|
|
string v = srs_listener_type2string(type);
|
|
|
|
|
srs_trace("%s listen at tcp://%s:%d, fd=%d", v.c_str(), ip.c_str(), port, listener->fd());
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SrsHttpFlvListener::on_tcp_client(srs_netfd_t stfd)
|
|
|
|
|
srs_error_t SrsHttpFlvListener::on_tcp_client(srs_netfd_t stfd)
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
|
|
|
|
|
if ((ret = caster->on_tcp_client(stfd)) != ERROR_SUCCESS) {
|
|
|
|
|
srs_warn("accept client error. ret=%d", ret);
|
|
|
|
|
return ret;
|
|
|
|
|
srs_error_t err = caster->on_tcp_client(stfd);
|
|
|
|
|
if (err != srs_success) {
|
|
|
|
|
srs_warn("accept client failed, err is %s", srs_error_desc(err).c_str());
|
|
|
|
|
srs_freep(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
@ -303,9 +293,9 @@ SrsUdpStreamListener::~SrsUdpStreamListener()
|
|
|
|
|
srs_freep(listener);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SrsUdpStreamListener::listen(string i, int p)
|
|
|
|
|
srs_error_t SrsUdpStreamListener::listen(string i, int p)
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
|
|
|
|
|
// the caller already ensure the type is ok,
|
|
|
|
|
// we just assert here for unknown stream caster.
|
|
|
|
@ -317,24 +307,19 @@ int SrsUdpStreamListener::listen(string i, int p)
|
|
|
|
|
srs_freep(listener);
|
|
|
|
|
listener = new SrsUdpListener(caster, ip, port);
|
|
|
|
|
|
|
|
|
|
if ((ret = listener->listen()) != ERROR_SUCCESS) {
|
|
|
|
|
srs_error("udp caster listen failed. ret=%d", ret);
|
|
|
|
|
return ret;
|
|
|
|
|
if ((err = listener->listen()) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "listen %s:%d", ip.c_str(), port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_info("listen thread current_cid=%d, "
|
|
|
|
|
"listen at port=%d, type=%d, fd=%d started success, ep=%s:%d",
|
|
|
|
|
_srs_context->get_id(), p, type, listener->fd(), i.c_str(), p);
|
|
|
|
|
|
|
|
|
|
// notify the handler the fd changed.
|
|
|
|
|
if ((ret = caster->on_stfd_change(listener->stfd())) != ERROR_SUCCESS) {
|
|
|
|
|
srs_error("notify handler fd changed. ret=%d", ret);
|
|
|
|
|
return ret;
|
|
|
|
|
if ((err = caster->on_stfd_change(listener->stfd())) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "notify fd change failed");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_trace("%s listen at udp://%s:%d, fd=%d", srs_listener_type2string(type).c_str(), ip.c_str(), port, listener->fd());
|
|
|
|
|
string v = srs_listener_type2string(type);
|
|
|
|
|
srs_trace("%s listen at udp://%s:%d, fd=%d", v.c_str(), ip.c_str(), port, listener->fd());
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef SRS_AUTO_STREAM_CASTER
|
|
|
|
@ -1044,7 +1029,7 @@ srs_error_t SrsServer::do_cycle()
|
|
|
|
|
|
|
|
|
|
srs_error_t SrsServer::listen_rtmp()
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
|
|
|
|
|
// stream service port.
|
|
|
|
|
std::vector<std::string> ip_ports = _srs_config->get_listens();
|
|
|
|
@ -1060,17 +1045,17 @@ srs_error_t SrsServer::listen_rtmp()
|
|
|
|
|
int port;
|
|
|
|
|
srs_parse_endpoint(ip_ports[i], ip, port);
|
|
|
|
|
|
|
|
|
|
if ((ret = listener->listen(ip, port)) != ERROR_SUCCESS) {
|
|
|
|
|
srs_error_new(ret, "rtmp listen %s:%d", ip.c_str(), port);
|
|
|
|
|
if ((err = listener->listen(ip, port)) != srs_success) {
|
|
|
|
|
srs_error_wrap(err, "rtmp listen %s:%d", ip.c_str(), port);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return srs_success;
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_error_t SrsServer::listen_http_api()
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
|
|
|
|
|
close_listeners(SrsListenerHttpApi);
|
|
|
|
|
if (_srs_config->get_http_api_enabled()) {
|
|
|
|
@ -1083,17 +1068,17 @@ srs_error_t SrsServer::listen_http_api()
|
|
|
|
|
int port;
|
|
|
|
|
srs_parse_endpoint(ep, ip, port);
|
|
|
|
|
|
|
|
|
|
if ((ret = listener->listen(ip, port)) != ERROR_SUCCESS) {
|
|
|
|
|
return srs_error_new(ret, "http api listen %s:%d", ip.c_str(), port);
|
|
|
|
|
if ((err = listener->listen(ip, port)) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "http api listen %s:%d", ip.c_str(), port);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return srs_success;
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_error_t SrsServer::listen_http_stream()
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
|
|
|
|
|
close_listeners(SrsListenerHttpStream);
|
|
|
|
|
if (_srs_config->get_http_stream_enabled()) {
|
|
|
|
@ -1106,17 +1091,17 @@ srs_error_t SrsServer::listen_http_stream()
|
|
|
|
|
int port;
|
|
|
|
|
srs_parse_endpoint(ep, ip, port);
|
|
|
|
|
|
|
|
|
|
if ((ret = listener->listen(ip, port)) != ERROR_SUCCESS) {
|
|
|
|
|
return srs_error_new(ret, "http stream listen %s:%d", ip.c_str(), port);
|
|
|
|
|
if ((err = listener->listen(ip, port)) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "http stream listen %s:%d", ip.c_str(), port);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return srs_success;
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_error_t SrsServer::listen_stream_caster()
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
|
|
|
|
|
#ifdef SRS_AUTO_STREAM_CASTER
|
|
|
|
|
close_listeners(SrsListenerMpegTsOverUdp);
|
|
|
|
@ -1152,13 +1137,13 @@ srs_error_t SrsServer::listen_stream_caster()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: support listen at <[ip:]port>
|
|
|
|
|
if ((ret = listener->listen("0.0.0.0", port)) != ERROR_SUCCESS) {
|
|
|
|
|
return srs_error_new(ret, "listen at %d", port);
|
|
|
|
|
if ((err = listener->listen("0.0.0.0", port)) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "listen at %d", port);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
return srs_success;
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SrsServer::close_listeners(SrsListenerType type)
|
|
|
|
@ -1198,40 +1183,27 @@ void SrsServer::resample_kbps()
|
|
|
|
|
srs_update_rtmp_server((int)conns.size(), kbps);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int SrsServer::accept_client(SrsListenerType type, srs_netfd_t stfd)
|
|
|
|
|
srs_error_t SrsServer::accept_client(SrsListenerType type, srs_netfd_t stfd)
|
|
|
|
|
{
|
|
|
|
|
int ret = ERROR_SUCCESS;
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
|
|
|
|
|
SrsConnection* conn = NULL;
|
|
|
|
|
|
|
|
|
|
if ((err = fd2conn(type, stfd, &conn)) != srs_success) {
|
|
|
|
|
srs_error("accept client failed, err=%s", srs_error_desc(err).c_str());
|
|
|
|
|
// TODO: FIXME: Use error
|
|
|
|
|
ret = srs_error_code(err);
|
|
|
|
|
srs_freep(err);
|
|
|
|
|
|
|
|
|
|
srs_close_stfd(stfd);
|
|
|
|
|
return ERROR_SUCCESS;
|
|
|
|
|
return srs_error_wrap(err, "fd2conn");
|
|
|
|
|
}
|
|
|
|
|
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 ((err = conn->start()) != srs_success) {
|
|
|
|
|
// TODO: FIXME: Use error
|
|
|
|
|
ret = srs_error_code(err);
|
|
|
|
|
srs_freep(err);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
return srs_error_wrap(err, "start conn coroutine");
|
|
|
|
|
}
|
|
|
|
|
srs_verbose("accept client finished. conns=%d, ret=%d", (int)conns.size(), ret);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_error_t SrsServer::fd2conn(SrsListenerType type, srs_netfd_t stfd, SrsConnection** pconn)
|
|
|
|
|