diff --git a/include/ur_client_library/comm/socket_t.h b/include/ur_client_library/comm/socket_t.h index 8a7d61f7d..67e2b024b 100644 --- a/include/ur_client_library/comm/socket_t.h +++ b/include/ur_client_library/comm/socket_t.h @@ -71,6 +71,8 @@ typedef int socket_t; # define MSG_NOSIGNAL 0 #endif +#include "ur_client_library/log.h" + /*! * \brief Get the last socket error as an std::error_code * @@ -92,3 +94,14 @@ inline std::system_error makeSocketError(const std::string& message) { return std::system_error(getLastSocketErrorCode(), message); } + +inline void setSocketOptionAndWarnOnError(socket_t socket, int level, int optname, const void* optval, + unsigned int optlen, const std::string& option_name) +{ + int result = ur_setsockopt(socket, level, optname, optval, optlen); + if (result != 0) + { + std::error_code error_code = getLastSocketErrorCode(); + URCL_LOG_WARN("Failed to set socket option %s: %s", option_name.c_str(), error_code.message().c_str()); + } +} diff --git a/src/comm/tcp_server.cpp b/src/comm/tcp_server.cpp index 3bb5559d5..f67b84727 100644 --- a/src/comm/tcp_server.cpp +++ b/src/comm/tcp_server.cpp @@ -26,6 +26,9 @@ */ //---------------------------------------------------------------------- +#ifndef _WIN32 +# include +#endif #include #include @@ -67,11 +70,11 @@ void TCPServer::init() { throw makeSocketError("Failed to create socket endpoint"); } - int flag = 1; + constexpr int flag = 1; #ifndef _WIN32 - ur_setsockopt(listen_fd_, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int)); + setSocketOptionAndWarnOnError(listen_fd_, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag), "SO_REUSEADDR"); #endif - ur_setsockopt(listen_fd_, SOL_SOCKET, SO_KEEPALIVE, &flag, sizeof(int)); + setSocketOptionAndWarnOnError(listen_fd_, SOL_SOCKET, SO_KEEPALIVE, &flag, sizeof(flag), "SO_KEEPALIVE"); URCL_LOG_DEBUG("Created socket with FD %d", (int)listen_fd_); @@ -257,6 +260,13 @@ void TCPServer::handleConnect() ur_close(client_fd); } } + + if (accepted) + { + constexpr int flag = 1; + setSocketOptionAndWarnOnError(client_fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag), "TCP_NODELAY"); + } + { std::lock_guard lk(callback_mutex_); if (new_connection_callback_ && accepted) diff --git a/src/comm/tcp_socket.cpp b/src/comm/tcp_socket.cpp index 6af840e0d..96e3a4dae 100644 --- a/src/comm/tcp_socket.cpp +++ b/src/comm/tcp_socket.cpp @@ -24,6 +24,7 @@ #include #include #include +#include "ur_client_library/comm/socket_t.h" #ifndef _WIN32 # include @@ -52,12 +53,12 @@ TCPSocket::~TCPSocket() void TCPSocket::setupOptions() { - int flag = 1; - ur_setsockopt(socket_fd_, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int)); + constexpr int flag = 1; + setSocketOptionAndWarnOnError(socket_fd_, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag), "TCP_NODELAY"); // macOS does not have TCP_QUICKACK #ifdef TCP_QUICKACK - ur_setsockopt(socket_fd_, IPPROTO_TCP, TCP_QUICKACK, &flag, sizeof(int)); + setSocketOptionAndWarnOnError(socket_fd_, IPPROTO_TCP, TCP_QUICKACK, &flag, sizeof(flag), "TCP_QUICKACK"); #endif if (recv_timeout_ != nullptr) @@ -65,9 +66,10 @@ void TCPSocket::setupOptions() #ifdef _WIN32 DWORD value = recv_timeout_->tv_sec * 1000; value += recv_timeout_->tv_usec / 1000; - ur_setsockopt(socket_fd_, SOL_SOCKET, SO_RCVTIMEO, &value, sizeof(value)); + setSocketOptionAndWarnOnError(socket_fd_, SOL_SOCKET, SO_RCVTIMEO, &value, sizeof(value), "SO_RCVTIMEO"); #else - ur_setsockopt(socket_fd_, SOL_SOCKET, SO_RCVTIMEO, recv_timeout_.get(), sizeof(timeval)); + setSocketOptionAndWarnOnError(socket_fd_, SOL_SOCKET, SO_RCVTIMEO, recv_timeout_.get(), sizeof(timeval), + "SO_RCVTIMEO"); #endif } }