i was going to switch some codebase to websocket server, too, but reading this lets me think again...
thanks ;) Am Thu, 4 Apr 2019 16:33:19 +0200 schrieb "Jason H" <jh...@gmx.com>: > I looked at the private implementation of QWebSocketServer, > QWebSocketServerPrivate. > > I haven't tested it, but there are a few concerns: > > 1. That for errorString(), it first checks if it doesn't have an error then > returns the QTcpSocket errorString(). But if you just look at serverError() > it only reports it's own error and nothing at the QTcpSocket level. This > means that if you only check serverError() you won't catch QTcpServer error. > This is probably a bug. QWebSocketProtocol::CloseCode needs to be able to > express QAbstractSocket::SocketErrors as well. > > 2. QWebSocketServerPrivate::handshakeReceived() has a check of > pTcpSocket->bytesAvailable()).endsWith(QByteArrayLiteral("\r\n\r\n") Such > position-reliant checks are bad form. There's no reason for it to end with, > it should probably be using contains() > > 3. There are multiple `if` blocks that don't set an error. This isn't wrong, > as the handhake bytes may come in slowly and take multiple re-parsings, > (something to add to your fuzzer?) but you can wind up in an uncaught error > state. > > > > Sent: Thursday, April 04, 2019 at 10:07 AM > From: "Jason H" <jh...@gmx.com> > To: "Narolewski Jakub" <izow...@gmail.com> > Cc: interest@qt-project.org > Subject: Re: [Interest] QWebSocketServer - server randomly stops accepting > connections > So, yeah, I was thinking of QTcpServer::incommingConnection(). That function > is used in multithreadding because you use the descriptor to make a socket on > the proper thread. Looks like QWebSocketServer is not multithreaded. > > I've used Qt's websockets, and I've used QTcpServer extensively on 5-nines > stuff. Never saw anything like this. > > Next steps: > - QWebSocketServer::setMaxPendingConnections() set this to 0, 1, or 100, see > what (if anything) changes. > - Use QTcpServer to and QWebSocketServer::handleConnection(QTcpSocket*) to > handle the connection yourself just to get QWebSocketServer out of the > initial connection stuff. > > Whatever the cause, I think you're in bug territory, either in Qt or the > linux kernel. Both of those is unlikely. There is one more possibilty, if > you're using secure sockets, maybe something is failing at the SSL level? > Like your SSL implementation stops working for whatever reason? > > Sent: Thursday, April 04, 2019 at 9:13 AM > From: "Narolewski Jakub" <izow...@gmail.com> > To: "Jason H" <jh...@gmx.com> > Cc: interest@qt-project.org > Subject: Re: [Interest] QWebSocketServer - server randomly stops accepting > connections > That's the thing. I already handle connections and disconnections in my code > - including logging relevant information. > When I implemented this I heavily based on the example that you linked to. > WSS communication is single threaded - only way to communicate with the > outside world from different thread is to send custom QEvent onto the Server > instance. > QWebSocketServer does not seem to have the method incomingConnection in it's > public API or maybe I already went mad :P I react to the > QWebSocketServer::newConnection signal. > > Last RST from client at 33 second mark is our client-side timeout. > This is the code that handles websocket stuff, I have stripped some parts > that are less important: > > // server connects > connect(m_wsServer, &QWebSocketServer::acceptError, this, > [this](QAbstractSocket::SocketError socketError) { > qCritical() << "QWebSocketServer - acceptError:" << socketError; > }); > > connect(m_wsServer, &QWebSocketServer::peerVerifyError, this, [this](const > QSslError& error) { > qCritical() << "QWebSocketServer - peerVerifyError:" << error; > }); > > connect(m_wsServer, &QWebSocketServer::serverError, this, > [this](QWebSocketProtocol::CloseCode closeCode) { > qCritical() << "QWebSocketServer - serverError:" << closeCode; > }); > > connect(m_wsServer, &QWebSocketServer::sslErrors, this, [this](const > QList<QSslError>& errors) { > qCritical() << "QWebSocketServer - sslErrors:" << errors; > }); > > connect(m_wsServer, &QWebSocketServer::closed, this, [this]() { > qCritical() << "QWebSocketServer - closed, serverError():" << > m_wsServer->errorString(); > }); > > connect(m_wsServer, &QWebSocketServer::newConnection, this, [this]() { > QWebSocket* clientSocket = m_wsServer->nextPendingConnection(); > qInfo() << "Got connection from client:" << > clientSocket->peerAddress(); > > [ client initialization stuff ] > > connect(clientSocket, &QWebSocket::binaryMessageReceived, this, > [this](const QByteArray& message) { > auto client = sender()->property("client").value<Client*>(); > > [ message deserialization ] > }); > > connect(clientSocket, &QWebSocket::disconnected, this, [this]() { > auto client = sender()->property("client").value<Client*>(); > qInfo() << client->sayHello() << "is disconnected."; > > client->handleDisconnection(); > > [ clinet cleanup stuff ] > }); > }); > > Client's handleDisconnection() function does: > > void i9ms::Client::handleDisconnection() > { > m_isConnected = false; > m_websocket->deleteLater(); > m_websocket = nullptr; > } > > Nothing from this lands in system logs. It seems that > QWebSocketServer::newConnection() is just not emited. > As I wrote earlier I have a timerEvent that logs QWebSocketServer's state - > once every ten minutes. > It happily reports that server is listening, has no pending connections and > it's internal 'errorString' is empty - even if it is mute from the outside. > > It's hard for me to pinpoint exactly what causes this. 'Time' is my best > guess. > I'm also not sure if quantity of connections plays a role here. > > I have a 'fuzzer-bot' that spams hundreds of connections and messages at the > server in short period of time. > Malformed messages, out-of-order client state changes, ugly words - you name > it we have it. > QWebSocketServer handles it well enough for us but then, at some time in > future WHILE being completely idle, server goes silent. > On the other hand I can start the server, connect - disconnect one client, > leave it for a while in idle and same thing happens, leaving me one step > closer to dementia. > > On Wed, 3 Apr 2019, 22:32 Jason H, <jh...@gmx.com> wrote: > Addendum, > > > > How much does you code diverge from the example? > > https://doc.qt.io/qt-5/echoserver.html > > Can you hack that to receive your traffic or augment your code to to do > > what it does? > > Note that the QWebSocket server does not take ownership of the QWebSocket, > > you have to track that manually. Using the code they provide, I would also > > log your connected clients. See the slot EchoServer::socketDisconnected() > > _______________________________________________ Interest mailing list > > Interest@qt-project.org https://lists.qt-project.org/listinfo/interest > -- /* * printk(KERN_ERR "happy meal: Transceiver BigMac ATTACK!"); * linux-2.6.19/drivers/net/sunhme.c */
pgpjznfQP0DJu.pgp
Description: Digitale Signatur von OpenPGP
_______________________________________________ Interest mailing list Interest@qt-project.org https://lists.qt-project.org/listinfo/interest