From 202a584aab6622bb3e0704190f37c3ea0775a718 Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 5 May 2019 08:17:48 +0800 Subject: [PATCH] Refine ST service. --- trunk/src/app/srs_app_listener.cpp | 32 ++++++++++++++++++--------- trunk/src/kernel/srs_kernel_error.hpp | 2 ++ trunk/src/service/srs_service_st.cpp | 28 +++++++++++++++++++---- trunk/src/service/srs_service_st.hpp | 9 +++++--- 4 files changed, 53 insertions(+), 18 deletions(-) diff --git a/trunk/src/app/srs_app_listener.cpp b/trunk/src/app/srs_app_listener.cpp index a88a83d5a..e8a520164 100755 --- a/trunk/src/app/srs_app_listener.cpp +++ b/trunk/src/app/srs_app_listener.cpp @@ -132,8 +132,13 @@ srs_error_t SrsUdpListener::listen() return srs_error_new(ERROR_SOCKET_CREATE, "create socket. ip=%s, port=%d", ip.c_str(), port); } - srs_fd_close_exec(_fd); - srs_socket_reuse_addr(_fd); + if ((err = srs_fd_closeexec(_fd)) != srs_success) { + return srs_error_wrap(err, "set closeexec"); + } + + if ((err = srs_fd_reuseaddr(_fd)) != srs_success) { + return srs_error_wrap(err, "set reuseaddr"); + } if (bind(_fd, r->ai_addr, r->ai_addrlen) == -1) { return srs_error_new(ERROR_SOCKET_BIND, "bind socket. ep=%s:%d", ip.c_str(), port);; @@ -230,16 +235,18 @@ srs_error_t SrsTcpListener::listen() // Detect alive for TCP connection. // @see https://github.com/ossrs/srs/issues/1044 -#ifdef SO_KEEPALIVE - int tcp_keepalive = 1; - if (setsockopt(_fd, SOL_SOCKET, SO_KEEPALIVE, &tcp_keepalive, sizeof(int)) == -1) { - return srs_error_new(ERROR_SOCKET_SETKEEPALIVE, "setsockopt SO_KEEPALIVE[%d]error. port=%d", tcp_keepalive, port); + if ((err = srs_fd_keepalive(_fd)) != srs_success) { + return srs_error_wrap(err, "set keepalive"); + } + + if ((err = srs_fd_closeexec(_fd)) != srs_success) { + return srs_error_wrap(err, "set closeexec"); + } + + if ((err = srs_fd_reuseaddr(_fd)) != srs_success) { + return srs_error_wrap(err, "set reuseaddr"); } -#endif - srs_fd_close_exec(_fd); - srs_socket_reuse_addr(_fd); - if (bind(_fd, r->ai_addr, r->ai_addrlen) == -1) { return srs_error_new(ERROR_SOCKET_BIND, "bind socket. ep=%s:%d", ip.c_str(), port);; } @@ -276,7 +283,10 @@ srs_error_t SrsTcpListener::cycle() } int cfd = srs_netfd_fileno(cstfd); - srs_fd_close_exec(cfd); + + if ((err = srs_fd_closeexec(cfd)) != srs_success) { + return srs_error_wrap(err, "set closeexec"); + } if ((err = handler->on_tcp_client(cstfd)) != srs_success) { return srs_error_wrap(err, "handle fd=%d", cfd); diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 95ab4cd36..11ab7bb77 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -115,6 +115,8 @@ #define ERROR_SOCKET_NO_NODELAY 1076 #define ERROR_SOCKET_SNDBUF 1077 #define ERROR_THREAD_STARTED 1078 +#define ERROR_SOCKET_SETREUSEADDR 1079 +#define ERROR_SOCKET_SETCLOSEEXEC 1080 /////////////////////////////////////////////////////// // RTMP protocol error. diff --git a/trunk/src/service/srs_service_st.cpp b/trunk/src/service/srs_service_st.cpp index debd9422d..1e9644f4b 100644 --- a/trunk/src/service/srs_service_st.cpp +++ b/trunk/src/service/srs_service_st.cpp @@ -86,17 +86,37 @@ void srs_close_stfd(srs_netfd_t& stfd) } } -void srs_fd_close_exec(int fd) +srs_error_t srs_fd_closeexec(int fd) { int flags = fcntl(fd, F_GETFD); flags |= FD_CLOEXEC; - fcntl(fd, F_SETFD, flags); + if (fcntl(fd, F_SETFD, flags) == -1) { + return srs_error_new(ERROR_SOCKET_SETCLOSEEXEC, "FD_CLOEXEC fd=%v", fd); + } + + return srs_success; } -void srs_socket_reuse_addr(int fd) +srs_error_t srs_fd_reuseaddr(int fd) { int v = 1; - setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(int)); + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(int)) == -1) { + return srs_error_new(ERROR_SOCKET_SETREUSEADDR, "SO_REUSEADDR fd=%v", fd); + } + + return srs_success; +} + +srs_error_t srs_fd_keepalive(int fd) +{ +#ifdef SO_KEEPALIVE + int v = 1; + if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &v, sizeof(int)) == -1) { + return srs_error_new(ERROR_SOCKET_SETKEEPALIVE, "SO_KEEPALIVE fd=%d", fd); + } +#endif + + return srs_success; } srs_thread_t srs_thread_self() diff --git a/trunk/src/service/srs_service_st.hpp b/trunk/src/service/srs_service_st.hpp index 383b1323d..eaca10955 100644 --- a/trunk/src/service/srs_service_st.hpp +++ b/trunk/src/service/srs_service_st.hpp @@ -44,10 +44,13 @@ extern srs_error_t srs_st_init(); extern void srs_close_stfd(srs_netfd_t& stfd); // Set the FD_CLOEXEC of FD. -extern void srs_fd_close_exec(int fd); +extern srs_error_t srs_fd_closeexec(int fd); -// Set the SO_REUSEADDR of socket. -extern void srs_socket_reuse_addr(int fd); +// Set the SO_REUSEADDR of fd. +extern srs_error_t srs_fd_reuseaddr(int fd); + +// Set the SO_KEEPALIVE of fd. +extern srs_error_t srs_fd_keepalive(int fd); // Get current coroutine/thread. extern srs_thread_t srs_thread_self();