96 lines
2.7 KiB
C++
96 lines
2.7 KiB
C++
#include <uvw.hpp>
|
|
#include <cassert>
|
|
#include <iostream>
|
|
#include <memory>
|
|
#include <chrono>
|
|
|
|
|
|
void listen(uvw::Loop &loop) {
|
|
std::shared_ptr<uvw::Tcp> tcp = loop.resource<uvw::Tcp>();
|
|
|
|
tcp->on<uvw::ErrorEvent>([](const uvw::ErrorEvent &, uvw::Tcp &) {
|
|
std::cout << "error " << std::endl;
|
|
});
|
|
|
|
tcp->once<uvw::ListenEvent>([](const uvw::ListenEvent &event, uvw::Tcp &srv) mutable {
|
|
std::cout << "listen" << std::endl;
|
|
|
|
std::shared_ptr<uvw::Tcp> client = srv.loop().resource<uvw::Tcp>();
|
|
|
|
client->on<uvw::ErrorEvent>([](const uvw::ErrorEvent &, uvw::Tcp &) {
|
|
std::cout << "error " << std::endl;
|
|
});
|
|
|
|
client->on<uvw::CloseEvent>([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<uvw::Tcp::IPv4>();
|
|
std::cout << "local: " << local.first << " " << local.second << std::endl;
|
|
|
|
uvw::Addr remote = client->remote<uvw::Tcp::IPv4>();
|
|
std::cout << "remote: " << remote.first << " " << remote.second << std::endl;
|
|
|
|
client->on<uvw::DataEvent>([](const uvw::DataEvent &event, uvw::Tcp &) {
|
|
std::cout << "data" << std::endl;
|
|
});
|
|
|
|
client->on<uvw::EndEvent>([](const uvw::EndEvent &, uvw::Tcp &client) {
|
|
std::cout << "end" << std::endl;
|
|
client.close();
|
|
});
|
|
|
|
client->read();
|
|
});
|
|
|
|
tcp->once<uvw::CloseEvent>([](const uvw::CloseEvent &, uvw::Tcp &) mutable {
|
|
std::cout << "close" << std::endl;
|
|
});
|
|
|
|
tcp->bind<uvw::Tcp::IPv4>("127.0.0.1", 4242);
|
|
tcp->listen();
|
|
}
|
|
|
|
|
|
void conn(uvw::Loop &loop) {
|
|
auto tcp = loop.resource<uvw::Tcp>();
|
|
|
|
tcp->on<uvw::ErrorEvent>([](const uvw::ErrorEvent &, uvw::Tcp &) {
|
|
std::cout << "error " << std::endl;
|
|
});
|
|
|
|
tcp->once<uvw::ConnectEvent>([](const uvw::ConnectEvent &, uvw::Tcp &tcp) mutable {
|
|
std::cout << "connect" << std::endl;
|
|
|
|
auto data = std::unique_ptr<char[]>(new char[1]);
|
|
data[0] = 'a';
|
|
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<uvw::CloseEvent>([](const uvw::CloseEvent &, uvw::Tcp &) mutable {
|
|
std::cout << "close" << std::endl;
|
|
});
|
|
|
|
tcp->connect<uvw::Tcp::IPv4>(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();
|
|
}
|