summaryrefslogtreecommitdiffstats
path: root/src/network/socket
diff options
context:
space:
mode:
authorLiang Qi <[email protected]>2016-03-22 07:24:57 +0100
committerLiang Qi <[email protected]>2016-03-22 07:28:42 +0100
commita02863234d76abb6c9f289026ae4ea3145924f30 (patch)
treeaef6381d0000a78ba69ac80eb03739b1c8ca5fc3 /src/network/socket
parente77b13621f0057374d83a2b884f03dd2e5b7b88c (diff)
parente4d79e1fdeb6b26ba0b12b578daacf7cd672b960 (diff)
Merge remote-tracking branch 'origin/5.7' into dev
Conflicts: configure mkspecs/common/wince/qplatformdefs.h src/plugins/platforms/directfb/qdirectfbbackingstore.cpp src/plugins/platforms/xcb/qxcbbackingstore.cpp Change-Id: Ied4d31264a9afca9514b51a7eb1494c28712793c
Diffstat (limited to 'src/network/socket')
-rw-r--r--src/network/socket/qabstractsocket.cpp77
-rw-r--r--src/network/socket/qabstractsocket_p.h3
-rw-r--r--src/network/socket/qabstractsocketengine.cpp12
-rw-r--r--src/network/socket/qabstractsocketengine_p.h4
-rw-r--r--src/network/socket/qhttpsocketengine.cpp3
-rw-r--r--src/network/socket/qlocalserver_win.cpp72
-rw-r--r--src/network/socket/qlocalsocket_win.cpp3
-rw-r--r--src/network/socket/qnativesocketengine.cpp1
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp9
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp2
-rw-r--r--src/network/socket/qnativesocketengine_winrt.cpp4
-rw-r--r--src/network/socket/qsocks5socketengine.cpp13
12 files changed, 138 insertions, 65 deletions
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 0969d841806..3ce2d63a396 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -562,7 +562,6 @@ QAbstractSocketPrivate::QAbstractSocketPrivate()
socketEngine(0),
cachedSocketDescriptor(-1),
readBufferMaxSize(0),
- writeBuffer(QABSTRACTSOCKET_BUFFERSIZE),
isBuffered(false),
connectTimer(0),
disconnectTimer(0),
@@ -572,6 +571,7 @@ QAbstractSocketPrivate::QAbstractSocketPrivate()
socketError(QAbstractSocket::UnknownSocketError),
preferredNetworkLayerProtocol(QAbstractSocket::UnknownNetworkLayerProtocol)
{
+ writeBufferChunkSize = QABSTRACTSOCKET_BUFFERSIZE;
}
/*! \internal
@@ -852,15 +852,16 @@ bool QAbstractSocketPrivate::writeToSocket()
written);
#endif
- // Remove what we wrote so far.
- writeBuffer.free(written);
if (written > 0) {
+ // Remove what we wrote so far.
+ writeBuffer.free(written);
// Don't emit bytesWritten() recursively.
if (!emittedBytesWritten) {
QScopedValueRollback<bool> r(emittedBytesWritten);
emittedBytesWritten = true;
emit q->bytesWritten(written);
}
+ emit q->channelBytesWritten(0, written);
}
if (writeBuffer.isEmpty() && socketEngine && !socketEngine->bytesToWrite())
@@ -1286,6 +1287,7 @@ void QAbstractSocketPrivate::emitReadyRead()
emittedReadyRead = true;
emit q->readyRead();
}
+ emit q->channelReadyRead(0);
}
/*! \internal
@@ -1298,6 +1300,18 @@ void QAbstractSocketPrivate::fetchConnectionParameters()
peerName = hostName;
if (socketEngine) {
+ if (q->isReadable()) {
+ const int inboundStreamCount = socketEngine->inboundStreamCount();
+ setReadChannelCount(qMax(1, inboundStreamCount));
+ if (inboundStreamCount == 0)
+ readChannelCount = 0;
+ }
+ if (q->isWritable()) {
+ const int outboundStreamCount = socketEngine->outboundStreamCount();
+ setWriteChannelCount(qMax(1, outboundStreamCount));
+ if (outboundStreamCount == 0)
+ writeChannelCount = 0;
+ }
socketEngine->setReadNotificationEnabled(true);
socketEngine->setWriteNotificationEnabled(true);
localPort = socketEngine->localPort();
@@ -1620,8 +1634,8 @@ void QAbstractSocket::connectToHost(const QString &hostName, quint16 port,
d->preferredNetworkLayerProtocol = protocol;
d->hostName = hostName;
d->port = port;
- d->buffer.clear();
- d->writeBuffer.clear();
+ d->setReadChannelCount(0);
+ d->setWriteChannelCount(0);
d->abortCalled = false;
d->pendingClose = false;
if (d->state != BoundState) {
@@ -1654,6 +1668,8 @@ void QAbstractSocket::connectToHost(const QString &hostName, quint16 port,
openMode |= QAbstractSocket::Unbuffered; // QUdpSocket
QIODevice::open(openMode);
+ d->readChannelCount = d->writeChannelCount = 0;
+
d->state = HostLookupState;
emit stateChanged(d->state);
@@ -1716,11 +1732,11 @@ void QAbstractSocket::connectToHost(const QHostAddress &address, quint16 port,
*/
qint64 QAbstractSocket::bytesToWrite() const
{
- Q_D(const QAbstractSocket);
+ const qint64 pendingBytes = QIODevice::bytesToWrite();
#if defined(QABSTRACTSOCKET_DEBUG)
- qDebug("QAbstractSocket::bytesToWrite() == %lld", d->writeBuffer.size());
+ qDebug("QAbstractSocket::bytesToWrite() == %lld", pendingBytes);
#endif
- return d->writeBuffer.size();
+ return pendingBytes;
}
/*!
@@ -1859,8 +1875,8 @@ bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, SocketState
Q_D(QAbstractSocket);
d->resetSocketLayer();
- d->writeBuffer.clear();
- d->buffer.clear();
+ d->setReadChannelCount(0);
+ d->setWriteChannelCount(0);
d->socketEngine = QAbstractSocketEngine::createSocketEngine(socketDescriptor, this);
if (!d->socketEngine) {
d->setError(UnsupportedSocketOperationError, tr("Operation on socket is not supported"));
@@ -1881,6 +1897,23 @@ bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, SocketState
QIODevice::open(openMode);
+ if (socketState == ConnectedState) {
+ if (isReadable()) {
+ const int inboundStreamCount = d->socketEngine->inboundStreamCount();
+ d->setReadChannelCount(qMax(1, inboundStreamCount));
+ if (inboundStreamCount == 0)
+ d->readChannelCount = 0;
+ }
+ if (isWritable()) {
+ const int outboundStreamCount = d->socketEngine->outboundStreamCount();
+ d->setWriteChannelCount(qMax(1, outboundStreamCount));
+ if (outboundStreamCount == 0)
+ d->writeChannelCount = 0;
+ }
+ } else {
+ d->readChannelCount = d->writeChannelCount = 0;
+ }
+
if (d->state != socketState) {
d->state = socketState;
emit stateChanged(d->state);
@@ -2138,8 +2171,10 @@ bool QAbstractSocket::waitForReadyRead(int msecs)
return false;
}
- Q_ASSERT(d->socketEngine);
do {
+ if (state() != ConnectedState)
+ return false;
+
bool readyToRead = false;
bool readyToWrite = false;
if (!d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, !d->writeBuffer.isEmpty(),
@@ -2161,9 +2196,6 @@ bool QAbstractSocket::waitForReadyRead(int msecs)
if (readyToWrite)
d->canWriteNotification();
-
- if (state() != ConnectedState)
- return false;
} while (msecs == -1 || qt_subtract_from_timeout(msecs, stopWatch.elapsed()) > 0);
return false;
}
@@ -2212,8 +2244,10 @@ bool QAbstractSocket::waitForBytesWritten(int msecs)
forever {
bool readyToRead = false;
bool readyToWrite = false;
- if (!d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, !d->writeBuffer.isEmpty(),
- qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
+ if (!d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite,
+ !d->readBufferMaxSize || d->buffer.size() < d->readBufferMaxSize,
+ !d->writeBuffer.isEmpty(),
+ qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
#if defined (QABSTRACTSOCKET_DEBUG)
qDebug("QAbstractSocket::waitForBytesWritten(%i) failed (%i, %s)",
msecs, d->socketEngine->error(), d->socketEngine->errorString().toLatin1().constData());
@@ -2228,8 +2262,7 @@ bool QAbstractSocket::waitForBytesWritten(int msecs)
#if defined (QABSTRACTSOCKET_DEBUG)
qDebug("QAbstractSocket::waitForBytesWritten calls canReadNotification");
#endif
- if(!d->canReadNotification())
- return false;
+ d->canReadNotification();
}
@@ -2328,7 +2361,7 @@ void QAbstractSocket::abort()
#if defined (QABSTRACTSOCKET_DEBUG)
qDebug("QAbstractSocket::abort()");
#endif
- d->writeBuffer.clear();
+ d->setWriteChannelCount(0);
if (d->state == UnconnectedState)
return;
#ifndef QT_NO_SSL
@@ -2472,8 +2505,10 @@ qint64 QAbstractSocket::writeData(const char *data, qint64 size)
qt_prettyDebug(data, qMin((int)size, 32), size).data(),
size, written);
#endif
- if (written >= 0)
+ if (written >= 0) {
emit bytesWritten(written);
+ emit channelBytesWritten(0, written);
+ }
return written;
}
@@ -2724,7 +2759,7 @@ void QAbstractSocket::disconnectFromHost()
d->peerPort = 0;
d->localAddress.clear();
d->peerAddress.clear();
- d->writeBuffer.clear();
+ d->setWriteChannelCount(0);
#if defined(QABSTRACTSOCKET_DEBUG)
qDebug("QAbstractSocket::disconnectFromHost() disconnected!");
diff --git a/src/network/socket/qabstractsocket_p.h b/src/network/socket/qabstractsocket_p.h
index a5c3fb619b1..ab642e039b9 100644
--- a/src/network/socket/qabstractsocket_p.h
+++ b/src/network/socket/qabstractsocket_p.h
@@ -55,7 +55,6 @@
#include "QtCore/qbytearray.h"
#include "QtCore/qlist.h"
#include "QtCore/qtimer.h"
-#include "private/qringbuffer_p.h"
#include "private/qiodevice_p.h"
#include "private/qabstractsocketengine_p.h"
#include "qnetworkproxy.h"
@@ -143,8 +142,6 @@ public:
void setErrorAndEmit(QAbstractSocket::SocketError errorCode, const QString &errorString);
qint64 readBufferMaxSize;
- QRingBuffer writeBuffer;
-
bool isBuffered;
QTimer *connectTimer;
diff --git a/src/network/socket/qabstractsocketengine.cpp b/src/network/socket/qabstractsocketengine.cpp
index d40a3a64a7b..3fffff6d5a7 100644
--- a/src/network/socket/qabstractsocketengine.cpp
+++ b/src/network/socket/qabstractsocketengine.cpp
@@ -83,6 +83,8 @@ QAbstractSocketEnginePrivate::QAbstractSocketEnginePrivate()
, socketProtocol(QAbstractSocket::UnknownNetworkLayerProtocol)
, localPort(0)
, peerPort(0)
+ , inboundStreamCount(0)
+ , outboundStreamCount(0)
, receiver(0)
{
}
@@ -261,4 +263,14 @@ void QAbstractSocketEngine::setPeerPort(quint16 port)
d_func()->peerPort = port;
}
+int QAbstractSocketEngine::inboundStreamCount() const
+{
+ return d_func()->inboundStreamCount;
+}
+
+int QAbstractSocketEngine::outboundStreamCount() const
+{
+ return d_func()->outboundStreamCount;
+}
+
QT_END_NAMESPACE
diff --git a/src/network/socket/qabstractsocketengine_p.h b/src/network/socket/qabstractsocketengine_p.h
index 945e205cfb8..0073a8b1f2b 100644
--- a/src/network/socket/qabstractsocketengine_p.h
+++ b/src/network/socket/qabstractsocketengine_p.h
@@ -174,6 +174,8 @@ public:
quint16 localPort() const;
QHostAddress peerAddress() const;
quint16 peerPort() const;
+ int inboundStreamCount() const;
+ int outboundStreamCount() const;
virtual bool isReadNotificationEnabled() const = 0;
virtual void setReadNotificationEnabled(bool enable) = 0;
@@ -227,6 +229,8 @@ public:
quint16 localPort;
QHostAddress peerAddress;
quint16 peerPort;
+ int inboundStreamCount;
+ int outboundStreamCount;
QAbstractSocketEngineReceiver *receiver;
};
diff --git a/src/network/socket/qhttpsocketengine.cpp b/src/network/socket/qhttpsocketengine.cpp
index 942d19c1b34..642c9bb10f7 100644
--- a/src/network/socket/qhttpsocketengine.cpp
+++ b/src/network/socket/qhttpsocketengine.cpp
@@ -510,7 +510,7 @@ void QHttpSocketEngine::slotSocketConnected()
data += "\r\n";
// qDebug() << ">>>>>>>> sending request" << this;
// qDebug() << data;
-// qDebug() << ">>>>>>>";
+// qDebug(">>>>>>>");
d->socket->write(data);
d->state = ConnectSent;
}
@@ -576,6 +576,7 @@ void QHttpSocketEngine::slotSocketReadNotification()
d->state = Connected;
setLocalAddress(d->socket->localAddress());
setLocalPort(d->socket->localPort());
+ d->inboundStreamCount = d->outboundStreamCount = 1;
setState(QAbstractSocket::ConnectedState);
d->authenticator.detach();
priv = QAuthenticatorPrivate::getPrivate(d->authenticator);
diff --git a/src/network/socket/qlocalserver_win.cpp b/src/network/socket/qlocalserver_win.cpp
index c2812e54f8e..8cb3449343f 100644
--- a/src/network/socket/qlocalserver_win.cpp
+++ b/src/network/socket/qlocalserver_win.cpp
@@ -198,6 +198,9 @@ bool QLocalServerPrivate::addListener()
memset(&listener.overlapped, 0, sizeof(listener.overlapped));
listener.overlapped.hEvent = eventHandle;
+
+ // Beware! ConnectNamedPipe will reset the eventHandle to non-signaled.
+ // Callers of addListener must check all listeners for connections.
if (!ConnectNamedPipe(listener.handle, &listener.overlapped)) {
switch (GetLastError()) {
case ERROR_IO_PENDING:
@@ -205,7 +208,6 @@ bool QLocalServerPrivate::addListener()
break;
case ERROR_PIPE_CONNECTED:
listener.connected = true;
- SetEvent(eventHandle);
break;
default:
CloseHandle(listener.handle);
@@ -241,7 +243,7 @@ bool QLocalServerPrivate::listen(const QString &name)
{
Q_Q(QLocalServer);
- QString pipePath = QLatin1String("\\\\.\\pipe\\");
+ const QLatin1String pipePath("\\\\.\\pipe\\");
if (name.startsWith(pipePath))
fullServerName = name;
else
@@ -257,6 +259,8 @@ bool QLocalServerPrivate::listen(const QString &name)
for (int i = 0; i < SYSTEM_MAX_PENDING_SOCKETS; ++i)
if (!addListener())
return false;
+
+ _q_onNewConnection();
return true;
}
@@ -270,37 +274,43 @@ void QLocalServerPrivate::_q_onNewConnection()
{
Q_Q(QLocalServer);
DWORD dummy;
-
- // Reset first, otherwise we could reset an event which was asserted
- // immediately after we checked the conn status.
- ResetEvent(eventHandle);
-
- // Testing shows that there is indeed absolutely no guarantee which listener gets
- // a client connection first, so there is no way around polling all of them.
- for (int i = 0; i < listeners.size(); ) {
- HANDLE handle = listeners[i].handle;
- if (listeners[i].connected
- || GetOverlappedResult(handle, &listeners[i].overlapped, &dummy, FALSE))
- {
- listeners.removeAt(i);
-
- addListener();
-
- if (pendingConnections.size() > maxPendingConnections)
- connectionEventNotifier->setEnabled(false);
-
- // Make this the last thing so connected slots can wreak the least havoc
- q->incomingConnection((quintptr)handle);
- } else {
- if (GetLastError() != ERROR_IO_INCOMPLETE) {
- q->close();
- setError(QLatin1String("QLocalServerPrivate::_q_onNewConnection"));
- return;
+ bool tryAgain;
+ do {
+ tryAgain = false;
+
+ // Reset first, otherwise we could reset an event which was asserted
+ // immediately after we checked the conn status.
+ ResetEvent(eventHandle);
+
+ // Testing shows that there is indeed absolutely no guarantee which listener gets
+ // a client connection first, so there is no way around polling all of them.
+ for (int i = 0; i < listeners.size(); ) {
+ HANDLE handle = listeners[i].handle;
+ if (listeners[i].connected
+ || GetOverlappedResult(handle, &listeners[i].overlapped, &dummy, FALSE))
+ {
+ listeners.removeAt(i);
+
+ addListener();
+
+ if (pendingConnections.size() > maxPendingConnections)
+ connectionEventNotifier->setEnabled(false);
+ else
+ tryAgain = true;
+
+ // Make this the last thing so connected slots can wreak the least havoc
+ q->incomingConnection((quintptr)handle);
+ } else {
+ if (GetLastError() != ERROR_IO_INCOMPLETE) {
+ q->close();
+ setError(QLatin1String("QLocalServerPrivate::_q_onNewConnection"));
+ return;
+ }
+
+ ++i;
}
-
- ++i;
}
- }
+ } while (tryAgain);
}
void QLocalServerPrivate::closeServer()
diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp
index 4e8ae41479d..7f9b8a7b069 100644
--- a/src/network/socket/qlocalsocket_win.cpp
+++ b/src/network/socket/qlocalsocket_win.cpp
@@ -148,7 +148,7 @@ void QLocalSocket::connectToServer(OpenMode openMode)
return;
}
- QString pipePath = QLatin1String("\\\\.\\pipe\\");
+ const QLatin1String pipePath("\\\\.\\pipe\\");
if (d->serverName.startsWith(pipePath))
d->fullServerName = d->serverName;
else
@@ -220,7 +220,6 @@ qint64 QLocalSocket::writeData(const char *data, qint64 maxSize)
d->pipeWriter = new QWindowsPipeWriter(d->handle, this);
connect(d->pipeWriter, SIGNAL(canWrite()), this, SLOT(_q_canWrite()));
connect(d->pipeWriter, SIGNAL(bytesWritten(qint64)), this, SIGNAL(bytesWritten(qint64)));
- d->pipeWriter->start();
}
return d->pipeWriter->write(data, maxSize);
}
diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp
index eefc0792aad..4063a225fbc 100644
--- a/src/network/socket/qnativesocketengine.cpp
+++ b/src/network/socket/qnativesocketengine.cpp
@@ -922,6 +922,7 @@ void QNativeSocketEngine::close()
d->localAddress.clear();
d->peerPort = 0;
d->peerAddress.clear();
+ d->inboundStreamCount = d->outboundStreamCount = 0;
if (d->readNotifier) {
qDeleteInEventHandler(d->readNotifier);
d->readNotifier = 0;
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index 1a3e2a5cae0..de091753d26 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -1027,6 +1027,7 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
localAddress.clear();
peerPort = 0;
peerAddress.clear();
+ inboundStreamCount = outboundStreamCount = 0;
if (socketDescriptor == -1)
return false;
@@ -1077,8 +1078,10 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
#endif
// Determine the remote address
- if (!::getpeername(socketDescriptor, &sa.a, &sockAddrSize))
+ if (!::getpeername(socketDescriptor, &sa.a, &sockAddrSize)) {
qt_socket_getPortAndAddress(&sa, &peerPort, &peerAddress);
+ inboundStreamCount = outboundStreamCount = 1;
+ }
// Determine the socket type (UDP/TCP)
int value = 0;
@@ -1101,10 +1104,10 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
else if (socketType == QAbstractSocket::UdpSocket) socketTypeStr = QStringLiteral("UdpSocket");
qDebug("QNativeSocketEnginePrivate::fetchConnectionParameters() local == %s:%i,"
- " peer == %s:%i, socket == %s - %s",
+ " peer == %s:%i, socket == %s - %s, inboundStreamCount == %i, outboundStreamCount == %i",
localAddress.toString().toLatin1().constData(), localPort,
peerAddress.toString().toLatin1().constData(), peerPort,socketTypeStr.toLatin1().constData(),
- socketProtocolStr.toLatin1().constData());
+ socketProtocolStr.toLatin1().constData(), inboundStreamCount, outboundStreamCount);
#endif
return true;
}
diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index 20f7ab26225..648f2bf376e 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -528,6 +528,7 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
localAddress.clear();
peerPort = 0;
peerAddress.clear();
+ inboundStreamCount = outboundStreamCount = 0;
if (socketDescriptor == -1)
return false;
@@ -576,6 +577,7 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
memset(&sa, 0, sizeof(sa));
if (::getpeername(socketDescriptor, &sa.a, &sockAddrSize) == 0) {
qt_socket_getPortAndAddress(socketDescriptor, &sa, &peerPort, &peerAddress);
+ inboundStreamCount = outboundStreamCount = 1;
} else {
WS_ERROR_DEBUG(WSAGetLastError());
}
diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp
index 68ee1e52d56..0f632abbb39 100644
--- a/src/network/socket/qnativesocketengine_winrt.cpp
+++ b/src/network/socket/qnativesocketengine_winrt.cpp
@@ -480,6 +480,7 @@ void QNativeSocketEngine::close()
d->localAddress.clear();
d->peerPort = 0;
d->peerAddress.clear();
+ d->inboundStreamCount = d->outboundStreamCount = 0;
}
bool QNativeSocketEngine::joinMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)
@@ -1082,6 +1083,7 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
localAddress.clear();
peerPort = 0;
peerAddress.clear();
+ inboundStreamCount = outboundStreamCount = 0;
HRESULT hr;
if (socketType == QAbstractSocket::TcpSocket) {
@@ -1117,6 +1119,7 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
hr = info->get_RemotePort(tmpHString.GetAddressOf());
Q_ASSERT_SUCCEEDED(hr);
peerPort = qt_QStringFromHString(tmpHString).toInt();
+ inboundStreamCount = outboundStreamCount = 1;
}
} else if (socketType == QAbstractSocket::UdpSocket) {
ComPtr<IHostName> hostName;
@@ -1144,6 +1147,7 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
hr = info->get_RemotePort(tmpHString.GetAddressOf());
Q_ASSERT_SUCCEEDED(hr);
peerPort = qt_QStringFromHString(tmpHString).toInt();
+ inboundStreamCount = outboundStreamCount = 1;
}
}
return true;
diff --git a/src/network/socket/qsocks5socketengine.cpp b/src/network/socket/qsocks5socketengine.cpp
index c873cbdedcf..0c15810a482 100644
--- a/src/network/socket/qsocks5socketengine.cpp
+++ b/src/network/socket/qsocks5socketengine.cpp
@@ -352,7 +352,7 @@ void QSocks5BindStore::add(qintptr socketDescriptor, QSocks5BindData *bindData)
{
QMutexLocker lock(&mutex);
if (store.contains(socketDescriptor)) {
- // qDebug() << "delete it";
+ // qDebug("delete it");
}
bindData->timeStamp.start();
store.insert(socketDescriptor, bindData);
@@ -370,9 +370,11 @@ bool QSocks5BindStore::contains(qintptr socketDescriptor)
QSocks5BindData *QSocks5BindStore::retrieve(qintptr socketDescriptor)
{
QMutexLocker lock(&mutex);
- if (!store.contains(socketDescriptor))
+ const auto it = store.constFind(socketDescriptor);
+ if (it == store.cend())
return 0;
- QSocks5BindData *bindData = store.take(socketDescriptor);
+ QSocks5BindData *bindData = it.value();
+ store.erase(it);
if (bindData) {
if (bindData->controlSocket->thread() != QThread::currentThread()) {
qWarning("Can not access socks5 bind data from different thread");
@@ -887,6 +889,7 @@ void QSocks5SocketEnginePrivate::parseRequestMethodReply()
localPort = port;
if (mode == ConnectMode) {
+ inboundStreamCount = outboundStreamCount = 1;
socks5State = Connected;
// notify the upper layer that we're done
q->setState(QAbstractSocket::ConnectedState);
@@ -1047,6 +1050,7 @@ bool QSocks5SocketEngine::initialize(qintptr socketDescriptor, QAbstractSocket::
d->localAddress = bindData->localAddress;
d->peerPort = bindData->peerPort;
d->peerAddress = bindData->peerAddress;
+ d->inboundStreamCount = d->outboundStreamCount = 1;
delete bindData;
QObject::connect(d->data->controlSocket, SIGNAL(connected()), this, SLOT(_q_controlSocketConnected()),
@@ -1187,7 +1191,7 @@ void QSocks5SocketEnginePrivate::_q_controlSocketReadNotification()
case Connected: {
QByteArray buf;
if (!data->authenticator->unSeal(data->controlSocket, &buf)) {
- // qDebug() << "unseal error maybe need to wait for more data";
+ // qDebug("unseal error maybe need to wait for more data");
}
if (buf.size()) {
QSOCKS5_DEBUG << dump(buf);
@@ -1486,6 +1490,7 @@ void QSocks5SocketEngine::close()
}
d->data->controlSocket->close();
}
+ d->inboundStreamCount = d->outboundStreamCount = 0;
#ifndef QT_NO_UDPSOCKET
if (d->udpData && d->udpData->udpSocket)
d->udpData->udpSocket->close();