Why do socket::receive() and socket::async_receive() have different return types?
From the documentation I can see that socket::receive() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... returns a variable of type "std::size_t", while the asynchronous version socket::async_receive() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... returns "void". This is also true for socket::send() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... and socket::async_send() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... . I was expecting that they would have the same return types, so there might be a good reason behind.
I would be grateful if someone can shed some light on this. Thank you. Álvaro
Async operations don't have a "result" until the handler has been scheduled for execution. The result of the operation is sent to the handler. Therefore, returning a size_t would be meaningless for the async versions of the operations since the number of bytes sent or received is not known when the call returns. The non-async versions block until there is a result, so they are able to return it directly. On Thu, 14 Jun 2018 at 15:49, Álvaro Cebrián Juan via Boost-users < boost-users@lists.boost.org> wrote:
From the documentation I can see that socket::receive() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... returns a variable of type "std::size_t", while the asynchronous version socket::async_receive() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... returns "void". This is also true for socket::send() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... and socket::async_send() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... . I was expecting that they would have the same return types, so there might be a good reason behind.
I would be grateful if someone can shed some light on this.
Thank you.
Álvaro _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org https://lists.boost.org/mailman/listinfo.cgi/boost-users
AMDG On 06/14/2018 08:04 AM, Álvaro Cebrián Juan via Boost-users wrote:
From the documentation I can see that socket::receive() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... returns a variable of type "std::size_t", while the asynchronous version socket::async_receive() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... returns "void". This is also true for socket::send() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... and socket::async_send() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... . I was expecting that they would have the same return types, so there might be a good reason behind.
receive returns the number of bytes received. async_receive cannot return this because it is not known when the call returns. Instead, the size is passed to the read handler.
I would be grateful if someone can shed some light on this.
In Christ, Steven Watanabe
On Thu, Jun 14, 2018 at 7:47 AM Álvaro Cebrián Juan via Boost-users
the asynchronous version socket::async_receive() returns "void".
If you want to get pendatic, the return type from an initiating
function is not void, but
typename async_result
Hello, Am 14.06.2018 um 16:04 schrieb Álvaro Cebrián Juan via Boost-users:
From the documentation I can see that socket::receive() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... returns a variable of type "std::size_t", while the asynchronous version socket::async_receive() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... returns "void".
`socket::receive()` returns how much has been received and is similar to `recv()`. `socket::async_receive()` does not actually receive stuff -- it only tells your `asio::io_service` that as *it* receives something it shall pass that data on to your callback. Because `socket::async_receive()` is asynchronous (it only registers the socket <-> callback) and doesn't receive anything it can't return any meaningful size. This is one of the concepts of asynchronous development, I think refreshing your knowledge about that would be benefital.
This is also true for socket::send() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da... and socket::async_send() https://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/basic_da.... I was expecting that they would have the same return types, so there might be a good reason behind.
I would be grateful if someone can shed some light on this.
Thank you.
Álvaro
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org https://lists.boost.org/mailman/listinfo.cgi/boost-users
participants (5)
-
Geert Martin Ijewski
-
Richard Hodges
-
Steven Watanabe
-
Vinnie Falco
-
Álvaro Cebrián Juan