From 4987ea710b2b95f1e1a8756b53997690f17e8fda Mon Sep 17 00:00:00 2001 From: Paul David Date: Thu, 2 Feb 2017 14:54:43 -0500 Subject: UDP transport: Utilize poll instead of select - Avoids the descriptor limit of 1024 on FD_SETSIZE - Fixes a buffer overflow due to that limit - Keeps select around for Windows compatibility --- host/lib/transport/udp_common.hpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'host/lib') diff --git a/host/lib/transport/udp_common.hpp b/host/lib/transport/udp_common.hpp index bf4712613..82eee237b 100644 --- a/host/lib/transport/udp_common.hpp +++ b/host/lib/transport/udp_common.hpp @@ -32,6 +32,7 @@ namespace uhd{ namespace transport{ * \return true when the socket is ready for receive */ UHD_INLINE bool wait_for_recv_ready(int sock_fd, double timeout){ +#ifdef UHD_PLATFORM_WIN32 // select is more portable than poll unfortunately //setup timeval for timeout timeval tv; //If the tv_usec > 1 second on some platforms, select will @@ -53,6 +54,17 @@ namespace uhd{ namespace transport{ //call select with timeout on receive socket return TEMP_FAILURE_RETRY(::select(sock_fd+1, &rset, NULL, NULL, &tv)) > 0; +#else + //calculate the total timeout in milliseconds (from seconds) + int total_timeout = int(timeout*1000); + + pollfd pfd_read; + pfd_read.fd = sock_fd; + pfd_read.events = POLLIN; + + //call poll with timeout on receive socket + return ::poll(&pfd_read, 1, total_timeout) > 0; +#endif } }} //namespace uhd::transport -- cgit v1.2.3