#pragma once #include "UVStream.h" #include namespace panda { namespace unievent { namespace backend { namespace uv { struct UVTcp : UVStream { UVTcp (UVLoop* loop, IStreamImplListener* lst, int domain) : UVStream(loop, lst) { if (domain == AF_UNSPEC) uvx_strict(uv_tcp_init(loop->uvloop, &uvh)); else uvx_strict(uv_tcp_init_ex(loop->uvloop, &uvh, domain)); } std::error_code open (sock_t sock) override { auto ret = uv_tcp_open(&uvh, sock); return uvx_ce(ret); } std::error_code bind (const net::SockAddr& addr, unsigned flags) override { unsigned uv_flags = 0; if (flags & Flags::IPV6ONLY) uv_flags |= UV_TCP_IPV6ONLY; return uvx_ce(uv_tcp_bind(&uvh, addr.get(), uv_flags)); } std::error_code connect (const net::SockAddr& addr, ConnectRequestImpl* _req) override { auto req = static_cast(_req); auto err = uv_tcp_connect(&req->uvr, &uvh, addr.get(), on_connect); if (!err) req->active = true; return uvx_ce(err); } expected sockaddr () const override { return uvx_sockaddr(&uvh, &uv_tcp_getsockname); } expected peeraddr () const override { return uvx_sockaddr(&uvh, &uv_tcp_getpeername); } std::error_code set_nodelay (bool enable) override { return uvx_ce(uv_tcp_nodelay(&uvh, enable)); } std::error_code set_keepalive (bool enable, unsigned delay) override { return uvx_ce(uv_tcp_keepalive(&uvh, enable, delay)); } std::error_code set_simultaneous_accepts (bool enable) override { return uvx_ce(uv_tcp_simultaneous_accepts(&uvh, enable)); } }; }}}}