8 #ifndef WPIUTIL_WPI_UV_TCP_H_
9 #define WPIUTIL_WPI_UV_TCP_H_
17 #include "wpi/Twine.h"
18 #include "wpi/uv/NetworkStream.h"
31 struct private_init {};
34 using Time = std::chrono::duration<uint64_t, std::milli>;
36 explicit Tcp(
const private_init&) {}
37 ~
Tcp() noexcept
override =
default;
46 unsigned int flags = AF_UNSPEC);
54 static std::shared_ptr<Tcp>
Create(
const std::shared_ptr<Loop>& loop,
55 unsigned int flags = AF_UNSPEC) {
56 return Create(*loop, flags);
69 void Reuse(std::function<
void()> callback,
unsigned int flags = AF_UNSPEC);
86 std::shared_ptr<Tcp>
Accept();
104 bool Accept(
const std::shared_ptr<Tcp>& client) {
116 void Open(uv_os_sock_t sock) { Invoke(&uv_tcp_open,
GetRaw(), sock); }
133 return uv_tcp_keepalive(
GetRaw(), enable, time.count()) == 0;
151 return uv_tcp_simultaneous_accepts(
GetRaw(), enable) == 0;
165 void Bind(
const sockaddr& addr,
unsigned int flags = 0) {
166 Invoke(&uv_tcp_bind,
GetRaw(), &addr, flags);
169 void Bind(
const sockaddr_in& addr,
unsigned int flags = 0) {
170 Bind(reinterpret_cast<const sockaddr&>(addr), flags);
173 void Bind(
const sockaddr_in6& addr,
unsigned int flags = 0) {
174 Bind(reinterpret_cast<const sockaddr&>(addr), flags);
191 void Bind(
const Twine& ip,
unsigned int port,
unsigned int flags = 0);
207 void Bind6(
const Twine& ip,
unsigned int port,
unsigned int flags = 0);
236 void Connect(
const sockaddr& addr,
const std::shared_ptr<TcpConnectReq>& req);
238 void Connect(
const sockaddr_in& addr,
239 const std::shared_ptr<TcpConnectReq>& req) {
240 Connect(reinterpret_cast<const sockaddr&>(addr), req);
243 void Connect(
const sockaddr_in6& addr,
244 const std::shared_ptr<TcpConnectReq>& req) {
245 Connect(reinterpret_cast<const sockaddr&>(addr), req);
261 void Connect(
const sockaddr& addr, std::function<
void()> callback);
263 void Connect(
const sockaddr_in& addr, std::function<
void()> callback) {
264 Connect(reinterpret_cast<const sockaddr&>(addr), callback);
267 void Connect(
const sockaddr_in6& addr, std::function<
void()> callback) {
268 Connect(reinterpret_cast<const sockaddr&>(addr), callback);
287 void Connect(
const Twine& ip,
unsigned int port,
288 const std::shared_ptr<TcpConnectReq>& req);
304 void Connect(
const Twine& ip,
unsigned int port,
305 std::function<
void()> callback);
323 void Connect6(
const Twine& ip,
unsigned int port,
324 const std::shared_ptr<TcpConnectReq>& req);
340 void Connect6(
const Twine& ip,
unsigned int port,
341 std::function<
void()> callback);
344 Tcp* DoAccept()
override;
347 std::function<void()> callback;
350 std::unique_ptr<ReuseData> m_reuseData;
358 Tcp& GetStream()
const {
359 return *
static_cast<Tcp*
>(&ConnectReq::GetStream());
366 #endif // WPIUTIL_WPI_UV_TCP_H_
void Bind(const sockaddr &addr, unsigned int flags=0)
Bind the handle to an IPv4 or IPv6 address and port.
Definition: Tcp.h:165
void Reuse(std::function< void()> callback, unsigned int flags=AF_UNSPEC)
Reuse this handle.
std::shared_ptr< NetworkStream > Accept()
Accept incoming connection.
Definition: NetworkStream.h:94
uv_tcp_t * GetRaw() const noexcept
Get the underlying handle data structure.
Definition: NetworkStream.h:145
std::shared_ptr< Tcp > Accept()
Accept incoming connection.
WPILib C++ utilities (wpiutil) namespace.
Definition: SmallString.h:21
sockaddr_storage GetPeer()
Get the address of the peer connected to the handle.
void Connect6(const Twine &ip, unsigned int port, const std::shared_ptr< TcpConnectReq > &req)
Establish an IPv6 TCP connection.
TCP handle.
Definition: Tcp.h:30
bool SetSimultaneousAccepts(bool enable)
Enable/Disable simultaneous asynchronous accept requests.
Definition: Tcp.h:150
static std::shared_ptr< Tcp > Create(Loop &loop, unsigned int flags=AF_UNSPEC)
Create a TCP handle.
Definition: NetworkStream.h:130
void Bind6(const Twine &ip, unsigned int port, unsigned int flags=0)
Bind the handle to an IPv6 address and port.
bool SetKeepAlive(bool enable, Time time=Time{0})
Enable/Disable TCP keep-alive.
Definition: Tcp.h:132
static std::shared_ptr< Tcp > Create(const std::shared_ptr< Loop > &loop, unsigned int flags=AF_UNSPEC)
Create a TCP handle.
Definition: Tcp.h:54
Event loop.
Definition: Loop.h:37
bool Accept(const std::shared_ptr< Tcp > &client)
Accept incoming connection.
Definition: Tcp.h:104
bool SetNoDelay(bool enable)
Enable/Disable Nagle's algorithm.
Definition: Tcp.h:123
TCP connection request.
Definition: Tcp.h:356
void Connect(const sockaddr &addr, const std::shared_ptr< TcpConnectReq > &req)
Establish an IPv4 or IPv6 TCP connection.
void Open(uv_os_sock_t sock)
Open an existing file descriptor or SOCKET as a TCP handle.
Definition: Tcp.h:116
sockaddr_storage GetSock()
Get the current address to which the handle is bound.
Connection request.
Definition: NetworkStream.h:27