diff options
Diffstat (limited to 'src/network/socket')
-rw-r--r-- | src/network/socket/qabstractsocket.cpp | 36 | ||||
-rw-r--r-- | src/network/socket/qlocalserver.h | 3 | ||||
-rw-r--r-- | src/network/socket/qnativesocketengine.cpp | 28 | ||||
-rw-r--r-- | src/network/socket/qnativesocketengine_p.h | 4 | ||||
-rw-r--r-- | src/network/socket/qnativesocketengine_win.cpp | 14 | ||||
-rw-r--r-- | src/network/socket/qnativesocketengine_winrt.cpp | 2 | ||||
-rw-r--r-- | src/network/socket/qsctpserver.h | 2 | ||||
-rw-r--r-- | src/network/socket/qsctpsocket.h | 2 | ||||
-rw-r--r-- | src/network/socket/qsocks5socketengine.cpp | 19 |
9 files changed, 73 insertions, 37 deletions
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp index 57c40194a3..7ecbf35489 100644 --- a/src/network/socket/qabstractsocket.cpp +++ b/src/network/socket/qabstractsocket.cpp @@ -491,7 +491,6 @@ #ifndef QABSTRACTSOCKET_BUFFERSIZE #define QABSTRACTSOCKET_BUFFERSIZE 32768 #endif -#define QT_CONNECT_TIMEOUT 30000 #define QT_TRANSFER_TIMEOUT 120000 QT_BEGIN_NAMESPACE @@ -1142,7 +1141,15 @@ void QAbstractSocketPrivate::_q_connectToNextAddress() q, SLOT(_q_abortConnectionAttempt()), Qt::DirectConnection); } - connectTimer->start(QT_CONNECT_TIMEOUT); + int connectTimeout = QNetworkConfigurationPrivate::DefaultTimeout; +#ifndef QT_NO_BEARERMANAGEMENT + QSharedPointer<QNetworkSession> networkSession = qvariant_cast< QSharedPointer<QNetworkSession> >(q->property("_q_networksession")); + if (networkSession) { + QNetworkConfiguration networkConfiguration = networkSession->configuration(); + connectTimeout = networkConfiguration.connectTimeout(); + } +#endif + connectTimer->start(connectTimeout); } // Wait for a write notification that will eventually call @@ -1279,11 +1286,11 @@ bool QAbstractSocketPrivate::readFromSocket() } if (!socketEngine->isValid()) { - setErrorAndEmit(socketEngine->error(), socketEngine->errorString()); #if defined(QABSTRACTSOCKET_DEBUG) qDebug("QAbstractSocketPrivate::readFromSocket() read failed: %s", - q->errorString().toLatin1().constData()); + socketEngine->errorString().toLatin1().constData()); #endif + setErrorAndEmit(socketEngine->error(), socketEngine->errorString()); resetSocketLayer(); return false; } @@ -2100,6 +2107,10 @@ bool QAbstractSocket::waitForConnected(int msecs) QElapsedTimer stopWatch; stopWatch.start(); +#ifndef QT_NO_BEARERMANAGEMENT + QSharedPointer<QNetworkSession> networkSession = qvariant_cast< QSharedPointer<QNetworkSession> >(property("_q_networksession")); +#endif + if (d->state == HostLookupState) { #if defined (QABSTRACTSOCKET_DEBUG) qDebug("QAbstractSocket::waitForConnected(%i) doing host name lookup", msecs); @@ -2107,10 +2118,7 @@ bool QAbstractSocket::waitForConnected(int msecs) QHostInfo::abortHostLookup(d->hostLookupId); d->hostLookupId = -1; #ifndef QT_NO_BEARERMANAGEMENT - QSharedPointer<QNetworkSession> networkSession; - QVariant v(property("_q_networksession")); - if (v.isValid()) { - networkSession = qvariant_cast< QSharedPointer<QNetworkSession> >(v); + if (networkSession) { d->_q_startConnecting(QHostInfoPrivate::fromName(d->hostName, networkSession)); } else #endif @@ -2128,14 +2136,21 @@ bool QAbstractSocket::waitForConnected(int msecs) if (state() == UnconnectedState) return false; // connect not im progress anymore! + int connectTimeout = QNetworkConfigurationPrivate::DefaultTimeout; +#ifndef QT_NO_BEARERMANAGEMENT + if (networkSession) { + QNetworkConfiguration networkConfiguration = networkSession->configuration(); + connectTimeout = networkConfiguration.connectTimeout(); + } +#endif bool timedOut = true; #if defined (QABSTRACTSOCKET_DEBUG) int attempt = 1; #endif while (state() == ConnectingState && (msecs == -1 || stopWatch.elapsed() < msecs)) { int timeout = qt_subtract_from_timeout(msecs, stopWatch.elapsed()); - if (msecs != -1 && timeout > QT_CONNECT_TIMEOUT) - timeout = QT_CONNECT_TIMEOUT; + if (msecs != -1 && timeout > connectTimeout) + timeout = connectTimeout; #if defined (QABSTRACTSOCKET_DEBUG) qDebug("QAbstractSocket::waitForConnected(%i) waiting %.2f secs for connection attempt #%i", msecs, timeout / 1000.0, attempt++); @@ -2448,7 +2463,6 @@ bool QAbstractSocket::atEnd() const \sa write(), waitForBytesWritten() */ -// Note! docs copied to QSslSocket::flush() bool QAbstractSocket::flush() { return d_func()->flush(); diff --git a/src/network/socket/qlocalserver.h b/src/network/socket/qlocalserver.h index 786885b6cd..52c533141f 100644 --- a/src/network/socket/qlocalserver.h +++ b/src/network/socket/qlocalserver.h @@ -56,7 +56,6 @@ class Q_NETWORK_EXPORT QLocalServer : public QObject Q_OBJECT Q_DECLARE_PRIVATE(QLocalServer) Q_PROPERTY(SocketOptions socketOptions READ socketOptions WRITE setSocketOptions) - Q_FLAGS(SocketOption SocketOptions) Q_SIGNALS: void newConnection(); @@ -69,7 +68,9 @@ public: OtherAccessOption = 0x4, WorldAccessOption = 0x7 }; + Q_FLAG(SocketOption) Q_DECLARE_FLAGS(SocketOptions, SocketOption) + Q_FLAG(SocketOptions) explicit QLocalServer(QObject *parent = Q_NULLPTR); ~QLocalServer(); diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp index b56d460b8c..cf3afe1845 100644 --- a/src/network/socket/qnativesocketengine.cpp +++ b/src/network/socket/qnativesocketengine.cpp @@ -358,17 +358,41 @@ bool QNativeSocketEnginePrivate::checkProxy(const QHostAddress &address) #if !defined(QT_NO_NETWORKPROXY) QObject *parent = q_func()->parent(); QNetworkProxy proxy; + QNetworkProxyQuery::QueryType queryType = QNetworkProxyQuery::TcpSocket; if (QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(parent)) { proxy = socket->proxy(); + switch (socket->socketType()) { + case QAbstractSocket::UdpSocket: + queryType = QNetworkProxyQuery::UdpSocket; + break; + case QAbstractSocket::SctpSocket: + queryType = QNetworkProxyQuery::SctpSocket; + break; + case QAbstractSocket::TcpSocket: + case QAbstractSocket::UnknownSocketType: + queryType = QNetworkProxyQuery::TcpSocket; + } } else if (QTcpServer *server = qobject_cast<QTcpServer *>(parent)) { proxy = server->proxy(); + queryType = QNetworkProxyQuery::TcpServer; +#ifndef QT_NO_SCTP + if (qobject_cast<QSctpServer *>(server)) + queryType = QNetworkProxyQuery::SctpServer; +#endif } else { // no parent -> no proxy return true; } - if (proxy.type() == QNetworkProxy::DefaultProxy) - proxy = QNetworkProxy::applicationProxy(); + if (proxy.type() == QNetworkProxy::DefaultProxy) { + // This is similar to what we have in QNetworkProxy::applicationProxy, + // the only difference is that we provide the correct query type instead of + // always using TcpSocket unconditionally (this is the default type for + // QNetworkProxyQuery). + QNetworkProxyQuery query; + query.setQueryType(queryType); + proxy = QNetworkProxyFactory::systemProxyForQuery(query).constFirst(); + } if (proxy.type() != QNetworkProxy::DefaultProxy && proxy.type() != QNetworkProxy::NoProxy) { diff --git a/src/network/socket/qnativesocketengine_p.h b/src/network/socket/qnativesocketengine_p.h index 46c7ae5c55..4d1d8e1eb1 100644 --- a/src/network/socket/qnativesocketengine_p.h +++ b/src/network/socket/qnativesocketengine_p.h @@ -108,9 +108,9 @@ union qt_sockaddr { namespace { namespace SetSALen { - template <typename T> void set(T *sa, typename QtPrivate::QEnableIf<(&T::sa_len, true), QT_SOCKLEN_T>::Type len) + template <typename T> void set(T *sa, typename std::enable_if<(&T::sa_len, true), QT_SOCKLEN_T>::type len) { sa->sa_len = len; } - template <typename T> void set(T *sin6, typename QtPrivate::QEnableIf<(&T::sin6_len, true), QT_SOCKLEN_T>::Type len) + template <typename T> void set(T *sin6, typename std::enable_if<(&T::sin6_len, true), QT_SOCKLEN_T>::type len) { sin6->sin6_len = len; } template <typename T> void set(T *, ...) {} } diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp index e203571a63..28aea6be3d 100644 --- a/src/network/socket/qnativesocketengine_win.cpp +++ b/src/network/socket/qnativesocketengine_win.cpp @@ -51,6 +51,7 @@ #include <qdebug.h> #include <qdatetime.h> #include <qnetworkinterface.h> +#include <qoperatingsystemversion.h> //#define QNATIVESOCKETENGINE_DEBUG #if defined(QNATIVESOCKETENGINE_DEBUG) @@ -334,11 +335,9 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc return false; } - QSysInfo::WinVersion osver = QSysInfo::windowsVersion(); - //Windows XP and 2003 support IPv6 but not dual stack sockets int protocol = (socketProtocol == QAbstractSocket::IPv6Protocol - || (socketProtocol == QAbstractSocket::AnyIPProtocol && osver >= QSysInfo::WV_6_0)) ? AF_INET6 : AF_INET; + || (socketProtocol == QAbstractSocket::AnyIPProtocol)) ? AF_INET6 : AF_INET; int type = (socketType == QAbstractSocket::UdpSocket) ? SOCK_DGRAM : SOCK_STREAM; // MSDN KB179942 states that on winnt 4 WSA_FLAG_OVERLAPPED is needed if socket is to be non blocking @@ -350,14 +349,11 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc #define WSA_FLAG_NO_HANDLE_INHERIT 0x80 #endif - SOCKET socket = INVALID_SOCKET; - // Windows 7 or later, try the new API - if ((osver & QSysInfo::WV_NT_based) >= QSysInfo::WV_6_1) - socket = ::WSASocket(protocol, type, 0, NULL, 0, WSA_FLAG_NO_HANDLE_INHERIT | WSA_FLAG_OVERLAPPED); + SOCKET socket = ::WSASocket(protocol, type, 0, NULL, 0, WSA_FLAG_NO_HANDLE_INHERIT | WSA_FLAG_OVERLAPPED); // previous call fails if the windows 7 service pack 1 or hot fix isn't installed. - // Try the old API if the new one failed on Windows 7, or always on earlier versions - if (socket == INVALID_SOCKET && ((osver & QSysInfo::WV_NT_based) <= QSysInfo::WV_6_1)) { + // Try the old API if the new one failed on Windows 7 + if (socket == INVALID_SOCKET && QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows8) { socket = ::WSASocket(protocol, type, 0, NULL, 0, WSA_FLAG_OVERLAPPED); #ifdef HANDLE_FLAG_INHERIT if (socket != INVALID_SOCKET) { diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp index 8b36406c67..7b20b47aa9 100644 --- a/src/network/socket/qnativesocketengine_winrt.cpp +++ b/src/network/socket/qnativesocketengine_winrt.cpp @@ -779,7 +779,6 @@ void QNativeSocketEngine::close() } } -#if _MSC_VER >= 1900 if (d->socketType == QAbstractSocket::TcpSocket) { hr = QEventDispatcherWinRT::runOnXamlThread([d]() { HRESULT hr; @@ -803,7 +802,6 @@ void QNativeSocketEngine::close() }); Q_ASSERT_SUCCEEDED(hr); } -#endif // _MSC_VER >= 1900 if (d->socketDescriptor != -1) { ComPtr<IClosable> socket; diff --git a/src/network/socket/qsctpserver.h b/src/network/socket/qsctpserver.h index f39257485d..1afdab28a0 100644 --- a/src/network/socket/qsctpserver.h +++ b/src/network/socket/qsctpserver.h @@ -45,7 +45,7 @@ QT_BEGIN_NAMESPACE -#ifndef QT_NO_SCTP +#if !defined(QT_NO_SCTP) || defined(Q_CLANG_QDOC) class QSctpServerPrivate; class QSctpSocket; diff --git a/src/network/socket/qsctpsocket.h b/src/network/socket/qsctpsocket.h index 3e5a545c4b..9bed1890ff 100644 --- a/src/network/socket/qsctpsocket.h +++ b/src/network/socket/qsctpsocket.h @@ -45,7 +45,7 @@ QT_BEGIN_NAMESPACE -#ifndef QT_NO_SCTP +#if !defined(QT_NO_SCTP) || defined(Q_CLANG_QDOC) class QSctpSocketPrivate; diff --git a/src/network/socket/qsocks5socketengine.cpp b/src/network/socket/qsocks5socketengine.cpp index 6db09f94cf..2847b910f3 100644 --- a/src/network/socket/qsocks5socketengine.cpp +++ b/src/network/socket/qsocks5socketengine.cpp @@ -54,6 +54,7 @@ #include "qurl.h" #include "qauthenticator.h" #include "private/qiodevice_p.h" +#include "private/qringbuffer_p.h" #include <qendian.h> #include <qnetworkinterface.h> @@ -280,7 +281,7 @@ struct QSocks5Data struct QSocks5ConnectData : public QSocks5Data { - QByteArray readBuffer; + QRingBuffer readBuffer; }; struct QSocks5BindData : public QSocks5Data @@ -1001,13 +1002,17 @@ QSocks5SocketEngine::~QSocks5SocketEngine() delete d->bindData; } -static QBasicAtomicInt descriptorCounter = Q_BASIC_ATOMIC_INITIALIZER(1); +static int nextDescriptor() +{ + static QBasicAtomicInt counter; + return 1 + counter.fetchAndAddRelaxed(1); +} bool QSocks5SocketEngine::initialize(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol) { Q_D(QSocks5SocketEngine); - d->socketDescriptor = descriptorCounter.fetchAndAddRelaxed(1); + d->socketDescriptor = nextDescriptor(); d->socketType = type; d->socketProtocol = protocol; @@ -1193,7 +1198,7 @@ void QSocks5SocketEnginePrivate::_q_controlSocketReadNotification() } if (buf.size()) { QSOCKS5_DEBUG << dump(buf); - connectData->readBuffer += buf; + connectData->readBuffer.append(buf); emitReadNotification(); } break; @@ -1506,7 +1511,7 @@ qint64 QSocks5SocketEngine::read(char *data, qint64 maxlen) Q_D(QSocks5SocketEngine); QSOCKS5_Q_DEBUG << "read( , maxlen = " << maxlen << ')'; if (d->mode == QSocks5SocketEnginePrivate::ConnectMode) { - if (d->connectData->readBuffer.size() == 0) { + if (d->connectData->readBuffer.isEmpty()) { if (d->data->controlSocket->state() == QAbstractSocket::UnconnectedState) { //imitate remote closed close(); @@ -1518,9 +1523,7 @@ qint64 QSocks5SocketEngine::read(char *data, qint64 maxlen) return 0; // nothing to be read } } - qint64 copy = qMin<qint64>(d->connectData->readBuffer.size(), maxlen); - memcpy(data, d->connectData->readBuffer.constData(), copy); - d->connectData->readBuffer.remove(0, copy); + const qint64 copy = d->connectData->readBuffer.read(data, maxlen); QSOCKS5_DEBUG << "read" << dump(QByteArray(data, copy)); return copy; #ifndef QT_NO_UDPSOCKET |