void TCPSocket::listen(int backlog) { TraceLS(this) << "Listening" << endl; init(); int r = uv_listen(ptr<uv_stream_t>(), backlog, internal::onAcceptConnection); if (r) setAndThrowError("TCP listen failed", r); }
void TCPSocket::connect(const net::Address& peerAddress) { TraceLS(this) << "Connecting to " << peerAddress << endl; init(); auto req = new uv_connect_t; req->data = this; int r = uv_tcp_connect(req, ptr<uv_tcp_t>(), peerAddress.addr(), internal::onConnect); if (r) setAndThrowError("TCP connect failed", r); }
bool UDPSocket::recvStart() { // UV_EALREADY means that the socket is already bound but that's okay // TODO: No need for boolean value as this method can throw exceptions // since it is called internally by bind(). int r = uv_udp_recv_start(ptr<uv_udp_t>(), UDPSocket::allocRecvBuffer, onRecv); if (r && r != UV_EALREADY) { setAndThrowError("Cannot start recv on invalid UDP socket", r); return false; } return true; }
void TCPSocket::bind(const net::Address& address, unsigned flags) { TraceLS(this) << "Binding on " << address << endl; init(); int r; switch (address.af()) { case AF_INET: r = uv_tcp_bind(ptr<uv_tcp_t>(), address.addr(), flags); break; //case AF_INET6: // r = uv_tcp_bind6(ptr<uv_tcp_t>(), *reinterpret_cast<const sockaddr_in6*>(address.addr())); // break; default: throw std::runtime_error("Unexpected address family"); } if (r) setAndThrowError("TCP bind failed", r); }
void UDPSocket::bind(const Address& address, unsigned flags) { TraceS(this) << "Binding on " << address << endl; int r; switch (address.af()) { case AF_INET: r = uv_udp_bind(ptr<uv_udp_t>(), address.addr(), flags); break; //case AF_INET6: // r = uv_udp_bind6(ptr<uv_udp_t>(), address.addr(), flags); // break; default: throw std::runtime_error("Unexpected address family"); } // Throw and exception of error if (r) setAndThrowError("Cannot bind UDP socket", r); // Open the receiver channel recvStart(); }