| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | //// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)//// Distributed under the Boost Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//// Official repository: https://github.com/boostorg/beast//#ifndef BOOST_BEAST_TEST_TCP_HPP#define BOOST_BEAST_TEST_TCP_HPP#include <boost/beast/core/detail/config.hpp>#include <boost/beast/core/detail/get_io_context.hpp>#include <boost/beast/_experimental/unit_test/suite.hpp>#include <boost/beast/_experimental/test/handler.hpp>#include <boost/asio/ip/tcp.hpp>#include <chrono>namespace boost {namespace beast {namespace test {/** Connect two TCP sockets together.*/template<class Executor>boolconnect(    net::basic_stream_socket<net::ip::tcp, Executor>& s1,    net::basic_stream_socket<net::ip::tcp, Executor>& s2){    auto ioc1 = beast::detail::get_io_context(s1);    auto ioc2 = beast::detail::get_io_context(s2);    if(! BEAST_EXPECT(ioc1 != nullptr))        return false;    if(! BEAST_EXPECT(ioc2 != nullptr))        return false;    if(! BEAST_EXPECT(ioc1 == ioc2))        return false;    auto& ioc = *ioc1;    try    {        net::basic_socket_acceptor<            net::ip::tcp, Executor> a(s1.get_executor());        auto ep = net::ip::tcp::endpoint(            net::ip::make_address_v4("127.0.0.1"), 0);        a.open(ep.protocol());        a.set_option(            net::socket_base::reuse_address(true));        a.bind(ep);        a.listen(0);        ep = a.local_endpoint();        a.async_accept(s2, test::success_handler());        s1.async_connect(ep, test::success_handler());        run(ioc);        if(! BEAST_EXPECT(            s1.remote_endpoint() == s2.local_endpoint()))            return false;        if(! BEAST_EXPECT(            s2.remote_endpoint() == s1.local_endpoint()))            return false;    }    catch(std::exception const& e)    {        beast::unit_test::suite::this_suite()->fail(            e.what(), __FILE__, __LINE__);        return false;    }    return true;}} // test} // beast} // boost#endif
 |