summaryrefslogtreecommitdiffstats
path: root/src/network/socket
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/socket')
-rw-r--r--src/network/socket/qabstractsocket.cpp36
-rw-r--r--src/network/socket/qlocalserver.h3
-rw-r--r--src/network/socket/qnativesocketengine.cpp28
-rw-r--r--src/network/socket/qnativesocketengine_p.h4
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp14
-rw-r--r--src/network/socket/qnativesocketengine_winrt.cpp2
-rw-r--r--src/network/socket/qsctpserver.h2
-rw-r--r--src/network/socket/qsctpsocket.h2
-rw-r--r--src/network/socket/qsocks5socketengine.cpp19
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