void on_read_avail(Poseidon::StreamBuffer data) override { LOG_POSEIDON_INFO("Connection read avail: remote = ", get_remote_info(), ", data = ", data.dump()); Poseidon::StreamBuffer buffer; buffer.put("[Response from echo server] "); buffer.splice(data); send(std::move(buffer)); set_timeout(g_keep_alive_timeout); }
void TcpClientBase::realConnect(bool useSsl){ if(::connect(m_socket.get(), static_cast<const ::sockaddr *>(SockAddr::getData()), SockAddr::getSize()) != 0){ if(errno != EINPROGRESS){ DEBUG_THROW(SystemException); } } if(useSsl){ LOG_POSEIDON_INFO("Initiating SSL handshake..."); AUTO(ssl, g_clientSslFactory.createSsl()); boost::scoped_ptr<SslFilterBase> filter(new SslFilter(STD_MOVE(ssl), getFd())); initSsl(STD_MOVE(filter)); } }
SocketServerBase::SocketServerBase(UniqueFile socket) : m_socket(STD_MOVE(socket)), m_local_info(get_local_ip_port_from_fd(m_socket.get())) { const int flags = ::fcntl(m_socket.get(), F_GETFL); if(flags == -1){ const int code = errno; LOG_POSEIDON_ERROR("Could not get fcntl flags on socket."); DEBUG_THROW(SystemException, code); } if(::fcntl(m_socket.get(), F_SETFL, flags | O_NONBLOCK) != 0){ const int code = errno; LOG_POSEIDON_ERROR("Could not set fcntl flags on socket."); DEBUG_THROW(SystemException, code); } LOG_POSEIDON_INFO("Created socket server, local = ", m_local_info); }
bool TcpServerBase::poll() const { UniqueFile client(::accept(get_fd(), NULLPTR, NULLPTR)); if(!client){ if(errno != EAGAIN){ DEBUG_THROW(SystemException); } return false; } AUTO(session, on_client_connect(STD_MOVE(client))); if(!session){ LOG_POSEIDON_WARNING("on_client_connect() returns a null pointer."); DEBUG_THROW(Exception, sslit("Null client pointer")); } if(m_ssl_factory){ AUTO(ssl, m_ssl_factory->create_ssl()); boost::scoped_ptr<SslFilterBase> filter(new SslFilter(STD_MOVE(ssl), session->get_fd())); session->init_ssl(STD_MOVE(filter)); } session->set_timeout(EpollDaemon::get_tcp_request_timeout()); EpollDaemon::add_session(session); LOG_POSEIDON_INFO("Accepted TCP connection from ", session->get_remote_info()); return true; }
SocketServerBase::~SocketServerBase(){ LOG_POSEIDON_INFO("Destroyed socket server, local = ", m_local_info); }
void on_close(int err_code) noexcept override { LOG_POSEIDON_INFO("Connection error: remote = ", get_remote_info(), ", err_code = ", err_code, ", desc = ", Poseidon::get_error_desc(err_code)); }
void on_read_hup() noexcept override { LOG_POSEIDON_INFO("Connection read hup: remote = ", get_remote_info()); }
void on_connect() override { LOG_POSEIDON_INFO("Connection established: remote = ", get_remote_info()); }