diff options
author | Josh Blum <josh@joshknows.com> | 2010-06-01 19:02:34 -0700 |
---|---|---|
committer | Josh Blum <josh@joshknows.com> | 2010-06-01 19:02:34 -0700 |
commit | c3bacdb0d3fa4dea0600462f9ea5cf94f506d13c (patch) | |
tree | 8003a428e367ccc1d9c9a9b5923223c42fbca76d | |
parent | 212159ca3bc00d233464cd6f9f454e5ac6e08f88 (diff) | |
download | uhd-c3bacdb0d3fa4dea0600462f9ea5cf94f506d13c.tar.gz uhd-c3bacdb0d3fa4dea0600462f9ea5cf94f506d13c.tar.bz2 uhd-c3bacdb0d3fa4dea0600462f9ea5cf94f506d13c.zip |
use polling for socket recv, timeout socket option not portable
-rw-r--r-- | host/lib/transport/udp_zero_copy_asio.cpp | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/host/lib/transport/udp_zero_copy_asio.cpp b/host/lib/transport/udp_zero_copy_asio.cpp index 190e3f9ce..ffd1a4d65 100644 --- a/host/lib/transport/udp_zero_copy_asio.cpp +++ b/host/lib/transport/udp_zero_copy_asio.cpp @@ -20,6 +20,7 @@ #include <boost/cstdint.hpp> #include <boost/asio.hpp> #include <boost/format.hpp> +#include <boost/thread.hpp> #include <iostream> using namespace uhd::transport; @@ -29,7 +30,6 @@ using namespace uhd::transport; **********************************************************************/ static const size_t MIN_SOCK_BUFF_SIZE = size_t(100e3); static const size_t MAX_DGRAM_SIZE = 1500; //assume max size on send and recv -static const double RECV_TIMEOUT = 0.1; // 100 ms /*********************************************************************** * Zero Copy UDP implementation with ASIO: @@ -64,16 +64,6 @@ public: _socket = new boost::asio::ip::udp::socket(_io_service); _socket->open(boost::asio::ip::udp::v4()); _socket->connect(receiver_endpoint); - - // set recv timeout - timeval tv; - tv.tv_sec = 0; - tv.tv_usec = size_t(RECV_TIMEOUT*1e6); - UHD_ASSERT_THROW(setsockopt( - _socket->native(), - SOL_SOCKET, SO_RCVTIMEO, - (const char *)&tv, sizeof(timeval) - ) == 0); } ~udp_zero_copy_impl(void){ @@ -113,7 +103,14 @@ private: boost::asio::io_service _io_service; size_t recv(const boost::asio::mutable_buffer &buff){ - return _socket->receive(boost::asio::buffer(buff)); + boost::asio::deadline_timer timer(_socket->get_io_service()); + timer.expires_from_now(boost::posix_time::milliseconds(100)); + while (not (_socket->available() or timer.expires_from_now().is_negative())){ + boost::this_thread::sleep(boost::posix_time::milliseconds(1)); + } + + if (_socket->available()) return _socket->receive(boost::asio::buffer(buff)); + return 0; //no bytes available, timeout... } size_t send(const boost::asio::const_buffer &buff){ |