From a57cb2a7a6721ed25fa7cfaa577ae1a985fc31f7 Mon Sep 17 00:00:00 2001 From: Christopher Kohlhoff Date: Sat, 2 Dec 2017 18:25:44 +1100 Subject: [PATCH] Suppress recv truncation errors on Windows, to match POSIX behaviour. --- example/cpp03/fork/daemon.cpp | 2 +- example/cpp03/tutorial/daytime5/server.cpp | 6 +----- example/cpp03/tutorial/daytime6/server.cpp | 2 +- example/cpp03/tutorial/daytime7/server.cpp | 2 +- example/cpp11/fork/daemon.cpp | 2 +- include/boost/asio/detail/impl/socket_ops.ipp | 16 ++++++++++++++++ 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/example/cpp03/fork/daemon.cpp b/example/cpp03/fork/daemon.cpp index 494e8d1b..53fdf287 100644 --- a/example/cpp03/fork/daemon.cpp +++ b/example/cpp03/fork/daemon.cpp @@ -39,7 +39,7 @@ private: void handle_receive(const boost::system::error_code& ec) { - if (!ec || ec == boost::asio::error::message_size) + if (!ec) { using namespace std; // For time_t, time and ctime; time_t now = time(0); diff --git a/example/cpp03/tutorial/daytime5/server.cpp b/example/cpp03/tutorial/daytime5/server.cpp index 72995878..6dc7816a 100644 --- a/example/cpp03/tutorial/daytime5/server.cpp +++ b/example/cpp03/tutorial/daytime5/server.cpp @@ -36,11 +36,7 @@ int main() boost::array recv_buf; udp::endpoint remote_endpoint; boost::system::error_code error; - socket.receive_from(boost::asio::buffer(recv_buf), - remote_endpoint, 0, error); - - if (error && error != boost::asio::error::message_size) - throw boost::system::system_error(error); + socket.receive_from(boost::asio::buffer(recv_buf), remote_endpoint); std::string message = make_daytime_string(); diff --git a/example/cpp03/tutorial/daytime6/server.cpp b/example/cpp03/tutorial/daytime6/server.cpp index 09f9c050..9a64ac1e 100644 --- a/example/cpp03/tutorial/daytime6/server.cpp +++ b/example/cpp03/tutorial/daytime6/server.cpp @@ -47,7 +47,7 @@ private: void handle_receive(const boost::system::error_code& error, std::size_t /*bytes_transferred*/) { - if (!error || error == boost::asio::error::message_size) + if (!error) { boost::shared_ptr message( new std::string(make_daytime_string())); diff --git a/example/cpp03/tutorial/daytime7/server.cpp b/example/cpp03/tutorial/daytime7/server.cpp index c83e74e4..ee00e816 100644 --- a/example/cpp03/tutorial/daytime7/server.cpp +++ b/example/cpp03/tutorial/daytime7/server.cpp @@ -119,7 +119,7 @@ private: void handle_receive(const boost::system::error_code& error) { - if (!error || error == boost::asio::error::message_size) + if (!error) { boost::shared_ptr message( new std::string(make_daytime_string())); diff --git a/example/cpp11/fork/daemon.cpp b/example/cpp11/fork/daemon.cpp index 4cbdd16a..4e055736 100644 --- a/example/cpp11/fork/daemon.cpp +++ b/example/cpp11/fork/daemon.cpp @@ -35,7 +35,7 @@ private: boost::asio::buffer(recv_buffer_), remote_endpoint_, [this](boost::system::error_code ec, std::size_t /*n*/) { - if (!ec || ec == boost::asio::error::message_size) + if (!ec) { using namespace std; // For time_t, time and ctime; time_t now = time(0); diff --git a/include/boost/asio/detail/impl/socket_ops.ipp b/include/boost/asio/detail/impl/socket_ops.ipp index 2b97387a..94be0f28 100644 --- a/include/boost/asio/detail/impl/socket_ops.ipp +++ b/include/boost/asio/detail/impl/socket_ops.ipp @@ -771,6 +771,8 @@ signed_size_type recv(socket_type s, buf* bufs, size_t count, ec = boost::asio::error::connection_reset; else if (ec.value() == ERROR_PORT_UNREACHABLE) ec = boost::asio::error::connection_refused; + else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) + ec.assign(0, ec.category()); if (result != 0) return socket_error_retval; ec = boost::system::error_code(); @@ -849,6 +851,10 @@ void complete_iocp_recv(state_type state, { ec = boost::asio::error::connection_refused; } + else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) + { + ec.assign(0, ec.category()); + } // Check for connection closed. else if (!ec && bytes_transferred == 0 @@ -919,6 +925,8 @@ signed_size_type recvfrom(socket_type s, buf* bufs, size_t count, ec = boost::asio::error::connection_reset; else if (ec.value() == ERROR_PORT_UNREACHABLE) ec = boost::asio::error::connection_refused; + else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) + ec.assign(0, ec.category()); if (result != 0) return socket_error_retval; ec = boost::system::error_code(); @@ -988,6 +996,10 @@ void complete_iocp_recvfrom( { ec = boost::asio::error::connection_refused; } + else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) + { + ec.assign(0, ec.category()); + } } #else // defined(BOOST_ASIO_HAS_IOCP) @@ -1101,6 +1113,10 @@ void complete_iocp_recvmsg( { ec = boost::asio::error::connection_refused; } + else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) + { + ec.assign(0, ec.category()); + } } #else // defined(BOOST_ASIO_HAS_IOCP)