udp::socket receiver(ios, udp::endpoint(udp::v4(), port)); char read_buf[buf_len]; udp::endpoint sender_point; receiver.receive_from(buffer(read_buf, sizeof(read_buf)), sender_point);
#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) int result = error_wrapper(::WSARecvFrom(s, bufs, recv_buf_count, &bytes_transferred, &recv_flags, addr, &tmp_addrlen, 0, 0), ec); *addrlen = (std::size_t)tmp_addrlen; ... if (result != 0) return socket_error_retval; ec = boost::system::error_code(); return bytes_transferred; #else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) msghdr msg = msghdr(); init_msghdr_msg_name(msg.msg_name, addr); msg.msg_namelen = *addrlen; msg.msg_iov = bufs; msg.msg_iovlen = count; int result = error_wrapper(::recvmsg(s, &msg, flags), ec); *addrlen = msg.msg_namelen; if (result >= 0) ec = boost::system::error_code(); return result;
template <typename ReturnType> inline ReturnType error_wrapper(ReturnType return_value, boost::system::error_code& ec) { #if defined(BOOST_WINDOWS) || defined(__CYGWIN__) ec = boost::system::error_code(WSAGetLastError(), boost::asio::error::get_system_category()); #else ec = boost::system::error_code(errno, boost::asio::error::get_system_category()); #endif return return_value; }
If no error occurs, WSARecvFrom returns zero. Otherwise, it can be retrieved by WSAGetLastError.
WSAEMSGSIZE
This has been the case.
MSG_TRUNC
Returns the actual packet length, even if it was larger than the buffer provided. This flag can only be used with packet protocols.
Output win:
Exception: receive_from: The message sent to the datagram socket was larger than the internal message buffer or a different network parameter was exceeded. It is also possible that the buffer for receiving the message was smaller than the size of the message.
Some test
Available: 36
Available: 18
Available: 0
output linux:
Some test
Available: 18
Available: 18
Available: 0
Source: https://habr.com/ru/post/139452/
All Articles