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,
134 static_cast<unsigned>(time.count())) == 0;
152 return uv_tcp_simultaneous_accepts(
GetRaw(), enable) == 0;
166 void Bind(
const sockaddr& addr,
unsigned int flags = 0) {
167 Invoke(&uv_tcp_bind,
GetRaw(), &addr, flags);
170 void Bind(
const sockaddr_in& addr,
unsigned int flags = 0) {
171 Bind(reinterpret_cast<const sockaddr&>(addr), flags);
174 void Bind(
const sockaddr_in6& addr,
unsigned int flags = 0) {
175 Bind(reinterpret_cast<const sockaddr&>(addr), flags);
192 void Bind(
const Twine& ip,
unsigned int port,
unsigned int flags = 0);
208 void Bind6(
const Twine& ip,
unsigned int port,
unsigned int flags = 0);
237 void Connect(
const sockaddr& addr,
const std::shared_ptr<TcpConnectReq>& req);
239 void Connect(
const sockaddr_in& addr,
240 const std::shared_ptr<TcpConnectReq>& req) {
241 Connect(reinterpret_cast<const sockaddr&>(addr), req);
244 void Connect(
const sockaddr_in6& addr,
245 const std::shared_ptr<TcpConnectReq>& req) {
246 Connect(reinterpret_cast<const sockaddr&>(addr), req);
262 void Connect(
const sockaddr& addr, std::function<
void()> callback);
264 void Connect(
const sockaddr_in& addr, std::function<
void()> callback) {
265 Connect(reinterpret_cast<const sockaddr&>(addr), callback);
268 void Connect(
const sockaddr_in6& addr, std::function<
void()> callback) {
269 Connect(reinterpret_cast<const sockaddr&>(addr), callback);
288 void Connect(
const Twine& ip,
unsigned int port,
289 const std::shared_ptr<TcpConnectReq>& req);
305 void Connect(
const Twine& ip,
unsigned int port,
306 std::function<
void()> callback);
324 void Connect6(
const Twine& ip,
unsigned int port,
325 const std::shared_ptr<TcpConnectReq>& req);
341 void Connect6(
const Twine& ip,
unsigned int port,
342 std::function<
void()> callback);
345 Tcp* DoAccept()
override;
348 std::function<void()> callback;
351 std::unique_ptr<ReuseData> m_reuseData;
359 Tcp& GetStream()
const {
360 return *static_cast<Tcp*>(&ConnectReq::GetStream());
367 #endif // WPIUTIL_WPI_UV_TCP_H_
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
Connection request.
Definition: NetworkStream.h:27
static std::shared_ptr< Tcp > Create(Loop &loop, unsigned int flags=AF_UNSPEC)
Create a TCP handle.
void Connect(const sockaddr &addr, const std::shared_ptr< TcpConnectReq > &req)
Establish an IPv4 or IPv6 TCP connection.
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
bool Accept(const std::shared_ptr< Tcp > &client)
Accept incoming connection.
Definition: Tcp.h:104
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.
bool SetNoDelay(bool enable)
Enable/Disable Nagle's algorithm.
Definition: Tcp.h:123
void Reuse(std::function< void()> callback, unsigned int flags=AF_UNSPEC)
Reuse this handle.
Definition: NetworkStream.h:130
WPILib C++ utilities (wpiutil) namespace.
Definition: EventLoopRunner.h:17
std::shared_ptr< NetworkStream > Accept()
Accept incoming connection.
Definition: NetworkStream.h:94
TCP handle.
Definition: Tcp.h:30
void Bind(const sockaddr &addr, unsigned int flags=0)
Bind the handle to an IPv4 or IPv6 address and port.
Definition: Tcp.h:166
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.
uv_tcp_t * GetRaw() const noexcept
Get the underlying handle data structure.
Definition: NetworkStream.h:145
std::shared_ptr< Tcp > Accept()
Accept incoming connection.
Event loop.
Definition: Loop.h:39
TCP connection request.
Definition: Tcp.h:357
bool SetSimultaneousAccepts(bool enable)
Enable/Disable simultaneous asynchronous accept requests.
Definition: Tcp.h:151