WebSocket::WebSocket(const SocketClient::SharedPtr& client) : mClient(client) { wslay_event_callbacks callbacks = { wslayRecvCallback, wslaySendCallback, 0, // genmask_callback 0, // on_frame_recv_start_callback 0, // on_frame_recv_callback 0, // on_frame_recv_end_callback wslayOnMsgRecvCallback }; wslay_event_context_server_init(&mCtx, &callbacks, this); client->readyRead().connect([this](const SocketClient::SharedPtr& client, Buffer&& buf) { if (buf.isEmpty()) return; mBuffers.push_back(std::move(buf)); if (wslay_event_recv(mCtx) < 0) { // close socket client->close(); mClient.reset(); mError(this); } }); client->disconnected().connect([this](const SocketClient::SharedPtr& client) { mClient.reset(); mDisconnected(this); }); }
void SocketClient::disconnect() { if (mFd != -1) { int ret; eintrwrap(ret, ::close(mFd)); EventLoop::instance()->removeFileDescriptor(mFd); mFd = -1; mDisconnected(this); } }
bool Connection::connectTcp(const String &host, uint16_t port, int timeout) { if (timeout > 0) { mTimeoutTimer = EventLoop::eventLoop()->registerTimer([&](int) { if (!mIsConnected) { mSocketClient.reset(); mDisconnected(this); } mTimeoutTimer = 0; }, timeout, Timer::SingleShot); } mSocketClient.reset(new SocketClient); mSocketClient->connected().connect(std::bind(&Connection::onClientConnected, this, std::placeholders::_1)); mSocketClient->disconnected().connect(std::bind(&Connection::onClientDisconnected, this, std::placeholders::_1)); mSocketClient->readyRead().connect(std::bind(&Connection::onDataAvailable, this, std::placeholders::_1, std::placeholders::_2)); mSocketClient->bytesWritten().connect(std::bind(&Connection::onDataWritten, this, std::placeholders::_1, std::placeholders::_2)); mSocketClient->error().connect(std::bind(&Connection::onSocketError, this, std::placeholders::_1, std::placeholders::_2)); if (!mSocketClient->connect(host, port)) { mSocketClient.reset(); return false; } return true; }
bool Connection::connectUnix(const Path &socketFile, int timeout) { if (timeout > 0) { mTimeoutTimer = EventLoop::eventLoop()->registerTimer([&](int) { if (!mIsConnected) { mSocketClient.reset(); mDisconnected(shared_from_this()); } mTimeoutTimer = 0; }, timeout, Timer::SingleShot); } mSocketClient.reset(new SocketClient); auto that = shared_from_this(); mSocketClient->connected().connect(std::bind(&Connection::onClientConnected, that, std::placeholders::_1)); mSocketClient->disconnected().connect(std::bind(&Connection::onClientDisconnected, that, std::placeholders::_1)); mSocketClient->readyRead().connect(std::bind(&Connection::onDataAvailable, that, std::placeholders::_1, std::placeholders::_2)); mSocketClient->bytesWritten().connect(std::bind(&Connection::onDataWritten, that, std::placeholders::_1, std::placeholders::_2)); mSocketClient->error().connect(std::bind(&Connection::onSocketError, that, std::placeholders::_1, std::placeholders::_2)); if (!mSocketClient->connect(socketFile)) { mSocketClient.reset(); return false; } return true; }