From 4920090da0fc937d171065694d5274221d2747c9 Mon Sep 17 00:00:00 2001 From: "Jonas M. Gastal" Date: Mon, 11 Jun 2012 22:27:03 -0300 Subject: If accept fails, stop accepting new connections and emit error signal. Task-number: QTBUG-24778 Change-Id: I6c5b685b3f861a0fafc1475c41bb35cede17d712 Reviewed-by: Thiago Macieira --- src/network/socket/qtcpserver.cpp | 42 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'src/network/socket/qtcpserver.cpp') diff --git a/src/network/socket/qtcpserver.cpp b/src/network/socket/qtcpserver.cpp index 331db627dd..90419502ba 100644 --- a/src/network/socket/qtcpserver.cpp +++ b/src/network/socket/qtcpserver.cpp @@ -90,6 +90,15 @@ \sa hasPendingConnections(), nextPendingConnection() */ +/*! \fn void QTcpServer::acceptError(QAbstractSocket::SocketError socketError) + \since 5.0 + + This signal is emitted when accepting a new connection results in an error. + The \a socketError parameter describes the type of error that occurred. + + \sa pauseAccepting(), resumeAccepting() +*/ + #include "qtcpserver.h" #include "private/qobject_p.h" #include "qalgorithms.h" @@ -209,8 +218,15 @@ void QTcpServerPrivate::readNotification() } int descriptor = socketEngine->accept(); - if (descriptor == -1) + if (descriptor == -1) { + if (socketEngine->error() != QAbstractSocket::TemporaryError) { + q->pauseAccepting(); + serverSocketError = socketEngine->error(); + serverSocketErrorString = socketEngine->errorString(); + emit q->acceptError(serverSocketError); + } break; + } #if defined (QTCPSERVER_DEBUG) qDebug("QTcpServerPrivate::_q_processIncomingConnection() accepted socket %i", descriptor); #endif @@ -650,6 +666,30 @@ QString QTcpServer::errorString() const return d_func()->serverSocketErrorString; } +/*! + \since 5.0 + + Pauses accepting new connections. Queued connections will remain in queue. + + \sa resumeAccepting() +*/ +void QTcpServer::pauseAccepting() +{ + d_func()->socketEngine->setReadNotificationEnabled(false); +} + +/*! + \since 5.0 + + Resumes accepting new connections. + + \sa pauseAccepting() +*/ +void QTcpServer::resumeAccepting() +{ + d_func()->socketEngine->setReadNotificationEnabled(true); +} + #ifndef QT_NO_NETWORKPROXY /*! \since 4.1 -- cgit v1.2.3