bool TcpService::_addTcpConnection(TcpSocket::Ptr socket, const std::vector<AddSocketOption::AddSocketOptionFunc>& optionFuncs) { struct TcpService::AddSocketOption::Options options; for (const auto& v : optionFuncs) { if (v != nullptr) { v(options); } } if (options.maxRecvBufferSize <= 0) { throw std::runtime_error("buffer size is zero"); } EventLoop::Ptr eventLoop; if (options.forceSameThreadLoop) { eventLoop = getSameThreadEventLoop(); } else { eventLoop = getRandomEventLoop(); } if (eventLoop == nullptr) { return false; } auto wrapperEnterCallback = [options](const TcpConnection::Ptr& tcpConnection) { for (const auto& callback : options.enterCallback) { callback(tcpConnection); } }; const auto isServerSide = socket->isServerSide(); auto tcpConnection = TcpConnection::Create(std::move(socket), options.maxRecvBufferSize, wrapperEnterCallback, eventLoop); (void)isServerSide; #ifdef USE_OPENSSL if (options.useSSL) { if (isServerSide) { if (options.sslHelper == nullptr || options.sslHelper->getOpenSSLCTX() == nullptr || !tcpConnection->initAcceptSSL(options.sslHelper->getOpenSSLCTX())) { return false; } } else { if (!tcpConnection->initConnectSSL()) { return false; } } } #else if (options.useSSL) { return false; } #endif eventLoop->runAsyncFunctor([tcpConnection]() { tcpConnection->onEnterEventLoop(); }); return true; }