#include #include #include #include #include void listen(uvw::Loop &loop) { std::shared_ptr tcp = loop.resource(); tcp->on([](const uvw::ErrorEvent &, uvw::Tcp &) { std::cout << "error " << std::endl; }); tcp->once([](const uvw::ListenEvent &event, uvw::Tcp &srv) mutable { std::cout << "listen" << std::endl; std::shared_ptr client = srv.loop().resource(); client->on([](const uvw::ErrorEvent &, uvw::Tcp &) { std::cout << "error " << std::endl; }); client->on([resource = srv.shared_from_this()](uvw::CloseEvent, uvw::Tcp &) mutable { std::cout << "close" << std::endl; uvw::Tcp &srv = *resource; srv.close(); }); srv.accept(*client); uvw::Addr local = srv.address(); std::cout << "local: " << local.first << " " << local.second << std::endl; uvw::Addr remote = client->remote(); std::cout << "remote: " << remote.first << " " << remote.second << std::endl; client->close(); }); tcp->once([](const uvw::CloseEvent &, uvw::Tcp &) mutable { std::cout << "close" << std::endl; }); tcp->bind("127.0.0.1", 4242); tcp->listen(); } void conn(uvw::Loop &loop) { auto tcp = loop.resource(); tcp->on([](const uvw::ErrorEvent &, uvw::Tcp &) { std::cout << "error " << std::endl; }); tcp->once([](const uvw::ConnectEvent &event, uvw::Tcp &tcp) mutable { std::cout << "connect" << std::endl; auto data = std::unique_ptr(new char[1]); data[0] = 42; uvw::Buffer buf{std::move(data), 1}; int bw = tcp.tryWrite(std::move(buf)); std::cout << "written: " << ((int)bw) << std::endl; tcp.close(); }); tcp->once([](const uvw::CloseEvent &, uvw::Tcp &) mutable { std::cout << "close" << std::endl; }); tcp->connect(std::string{"127.0.0.1"}, 4242); } void g() { auto loop = uvw::Loop::getDefault(); listen(*loop); conn(*loop); loop->run(); loop = nullptr; } int main() { g(); }