diff --git a/ur_rtde_driver/include/ur_rtde_driver/comm/producer.h b/ur_rtde_driver/include/ur_rtde_driver/comm/producer.h index e309697..58a20ee 100644 --- a/ur_rtde_driver/include/ur_rtde_driver/comm/producer.h +++ b/ur_rtde_driver/include/ur_rtde_driver/comm/producer.h @@ -44,6 +44,10 @@ public: void setupProducer() { + timeval tv; + tv.tv_sec = 1; + tv.tv_usec = 0; + stream_.setReceiveTimeout(tv); stream_.connect(); } void teardownProducer() diff --git a/ur_rtde_driver/include/ur_rtde_driver/comm/tcp_socket.h b/ur_rtde_driver/include/ur_rtde_driver/comm/tcp_socket.h index a9c51a6..54400d7 100644 --- a/ur_rtde_driver/include/ur_rtde_driver/comm/tcp_socket.h +++ b/ur_rtde_driver/include/ur_rtde_driver/comm/tcp_socket.h @@ -23,6 +23,7 @@ #include #include #include +#include namespace ur_driver { @@ -44,6 +45,7 @@ class TCPSocket private: std::atomic socket_fd_; std::atomic state_; + std::unique_ptr recv_timeout_; protected: virtual bool open(int socket_fd, struct sockaddr* address, size_t address_len) @@ -111,6 +113,13 @@ public: * \brief Closes the connection to the socket. */ void close(); + + /*! + * \brief Setup Receive timeout used for this socket. + * + * \param timeout Timeout used for setting things up + */ + void setReceiveTimeout(const timeval& timeout); }; } // namespace comm } // namespace ur_driver diff --git a/ur_rtde_driver/src/comm/tcp_socket.cpp b/ur_rtde_driver/src/comm/tcp_socket.cpp index 76ec7c6..a8337e3 100644 --- a/ur_rtde_driver/src/comm/tcp_socket.cpp +++ b/ur_rtde_driver/src/comm/tcp_socket.cpp @@ -44,6 +44,11 @@ void TCPSocket::setOptions(int socket_fd) int flag = 1; setsockopt(socket_fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int)); setsockopt(socket_fd, IPPROTO_TCP, TCP_QUICKACK, &flag, sizeof(int)); + + if (recv_timeout_ != nullptr) + { + setsockopt(socket_fd, SOL_SOCKET, SO_RCVTIMEO, recv_timeout_.get(), sizeof(timeval)); + } } bool TCPSocket::setup(std::string& host, int port) @@ -188,5 +193,16 @@ bool TCPSocket::write(const uint8_t* buf, const size_t buf_len, size_t& written) return true; } + +void TCPSocket::setReceiveTimeout(const timeval& timeout) +{ + recv_timeout_.reset(new timeval(timeout)); + + if (state_ == SocketState::Connected) + { + setOptions(socket_fd_); + } +} + } // namespace comm } // namespace ur_driver