8 #include "protocolhttp.h" 12 #include <Cutelyst/Engine> 15 #include <QLoggingCategory> 17 Q_LOGGING_CATEGORY(C_SERVER_TCP,
"cutelyst.server.tcp", QtWarningMsg)
21 TcpServer::TcpServer(
const QByteArray &serverAddress,
26 , m_serverAddress(serverAddress)
28 , m_protocol(protocol)
32 if (m_server->tcpNodelay()) {
35 if (m_server->soKeepalive()) {
38 if (m_server->socketSndbuf() != -1) {
40 m_server->socketSndbuf());
42 if (m_server->socketRcvbuf() != -1) {
44 m_server->socketRcvbuf());
48 void TcpServer::incomingConnection(qintptr handle)
50 auto sock =
new TcpSocket(m_engine,
this);
51 sock->serverAddress = m_serverAddress;
52 sock->protoData = m_protocol->createData(sock);
55 sock->timeout =
false;
56 sock->proto->parse(sock, sock);
58 connect(sock, &TcpSocket::finished,
this, [
this, sock] {
60 if (--m_processing == 0) {
61 m_engine->stopSocketTimeout();
65 if (Q_LIKELY(sock->setSocketDescriptor(
67 sock->proto = m_protocol;
69 sock->remoteAddress = sock->peerAddress();
70 sock->remotePort = sock->peerPort();
71 sock->protoData->setupNewConnection(sock);
73 for (
const auto &opt : m_socketOptions) {
74 sock->setSocketOption(opt.first, opt.second);
78 m_engine->startSocketTimeout();
85 void TcpServer::shutdown()
89 if (m_processing == 0) {
90 m_engine->serverShutdown();
93 for (
auto child : childrenL) {
96 connect(socket, &TcpSocket::finished,
this, [
this]() {
97 if (m_processing == 0) {
98 m_engine->serverShutdown();
101 m_engine->handleSocketShutdown(socket);
107 void TcpServer::timeoutConnections()
111 for (
auto child : childrenL) {
113 if (socket && !socket->processing &&
115 if (socket->timeout) {
116 qCInfo(C_SERVER_TCP) <<
"timing out connection" 118 socket->connectionClose();
120 socket->timeout =
true;
127 Protocol *TcpServer::protocol()
const 132 void TcpServer::setProtocol(
Protocol *protocol)
134 m_protocol = protocol;
137 #include "moc_tcpserver.cpp" QHostAddress peerAddress() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
const QObjectList & children() const const
QString toString() const const
The Cutelyst namespace holds all public Cutelyst API.
T qobject_cast(QObject *object)
QObject * parent() const const