diff options
Diffstat (limited to 'src/network/socket')
-rw-r--r-- | src/network/socket/qabstractsocket.cpp | 13 | ||||
-rw-r--r-- | src/network/socket/qlocalserver.cpp | 40 | ||||
-rw-r--r-- | src/network/socket/qlocalserver.h | 2 | ||||
-rw-r--r-- | src/network/socket/qlocalsocket.cpp | 14 | ||||
-rw-r--r-- | src/network/socket/qlocalsocket_win.cpp | 4 | ||||
-rw-r--r-- | src/network/socket/qnativesocketengine_unix.cpp | 3 | ||||
-rw-r--r-- | src/network/socket/qnativesocketengine_win.cpp | 4 | ||||
-rw-r--r-- | src/network/socket/qtcpserver_p.h | 3 |
8 files changed, 69 insertions, 14 deletions
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp index 7ecbf35489..9cb6c4be57 100644 --- a/src/network/socket/qabstractsocket.cpp +++ b/src/network/socket/qabstractsocket.cpp @@ -943,7 +943,9 @@ void QAbstractSocketPrivate::resolveProxy(const QString &hostname, quint16 port) // DefaultProxy here will raise an error proxyInUse = QNetworkProxy(); } +#endif // !QT_NO_NETWORKPROXY +#if !defined(QT_NO_NETWORKPROXY) || defined(Q_OS_WINRT) /*! \internal @@ -981,7 +983,7 @@ void QAbstractSocketPrivate::startConnectingByName(const QString &host) emit q->stateChanged(state); } -#endif +#endif // !QT_NO_NETWORKPROXY || Q_OS_WINRT /*! \internal @@ -1113,10 +1115,6 @@ void QAbstractSocketPrivate::_q_connectToNextAddress() // (localhost address on BSD or any UDP connect), emit // connected() and return. if ( -#if defined(Q_OS_WINRT) && _MSC_VER >= 1900 - !qEnvironmentVariableIsEmpty("QT_WINRT_USE_THREAD_NETWORK_CONTEXT") ? - socketEngine->connectToHostByName(hostName, port) : -#endif socketEngine->connectToHost(host, port)) { //_q_testConnection(); fetchConnectionParameters(); @@ -1712,6 +1710,7 @@ void QAbstractSocket::connectToHost(const QString &hostName, quint16 port, QIODevice::open(openMode); d->readChannelCount = d->writeChannelCount = 0; +#ifndef Q_OS_WINRT d->state = HostLookupState; emit stateChanged(d->state); @@ -1749,6 +1748,10 @@ void QAbstractSocket::connectToHost(const QString &hostName, quint16 port, (d->state == ConnectingState || d->state == HostLookupState) ? " (connection in progress)" : ""); #endif +#else // !Q_OS_WINRT + // On WinRT we should always connect by name. Lookup and proxy handling are done by the API. + d->startConnectingByName(hostName); +#endif } /*! \overload diff --git a/src/network/socket/qlocalserver.cpp b/src/network/socket/qlocalserver.cpp index 3fcec954e7..a9789b7d04 100644 --- a/src/network/socket/qlocalserver.cpp +++ b/src/network/socket/qlocalserver.cpp @@ -41,6 +41,10 @@ #include "qlocalserver_p.h" #include "qlocalsocket.h" +#if defined(Q_OS_WIN) && !defined(QT_LOCALSOCKET_TCP) +#include <QtCore/qt_windows.h> +#endif + QT_BEGIN_NAMESPACE /*! @@ -181,6 +185,42 @@ QLocalServer::SocketOptions QLocalServer::socketOptions() const } /*! + \since 5.10 + Returns the native socket descriptor the server uses to listen + for incoming instructions, or -1 if the server is not listening. + + The type of the descriptor depends on the platform: + \list + \li On Windows, the returned value is a + \l{https://msdn.microsoft.com/en-us/library/windows/desktop/ms740522(v=vs.85).aspx} + {Winsock 2 Socket Handle}. + + \li With WinRT and on INTEGRITY, the returned value is the + QTcpServer socket descriptor and the type is defined by + \l{QTcpServer::socketDescriptor}{socketDescriptor}. + + \li On all other UNIX-like operating systems, the type is + a file descriptor representing a listening socket. + \endlist + + \sa listen() +*/ +qintptr QLocalServer::socketDescriptor() const +{ + Q_D(const QLocalServer); + if (!isListening()) + return -1; +#if defined(QT_LOCALSOCKET_TCP) + return d->tcpServer.socketDescriptor(); +#elif defined(Q_OS_WIN) + const auto handle = d->connectionEventNotifier->handle(); + return handle != INVALID_HANDLE_VALUE ? qintptr(handle) : -1; +#else + return d->socketNotifier->socket(); +#endif +} + +/*! Stop listening for incoming connections. Existing connections are not affected, but any new connections will be refused. diff --git a/src/network/socket/qlocalserver.h b/src/network/socket/qlocalserver.h index 9bd2990389..454ac30c9b 100644 --- a/src/network/socket/qlocalserver.h +++ b/src/network/socket/qlocalserver.h @@ -92,6 +92,8 @@ public: void setSocketOptions(SocketOptions options); SocketOptions socketOptions() const; + qintptr socketDescriptor() const; + protected: virtual void incomingConnection(quintptr socketDescriptor); diff --git a/src/network/socket/qlocalsocket.cpp b/src/network/socket/qlocalsocket.cpp index 090a9e98c6..6fec2fdbd2 100644 --- a/src/network/socket/qlocalsocket.cpp +++ b/src/network/socket/qlocalsocket.cpp @@ -126,6 +126,20 @@ QT_BEGIN_NAMESPACE The socket descriptor is not available when QLocalSocket is in UnconnectedState. + The type of the descriptor depends on the platform: + + \list + \li On Windows, the returned value is a + \l{https://msdn.microsoft.com/en-us/library/windows/desktop/ms740522(v=vs.85).aspx} + {Winsock 2 Socket Handle}. + + \li With WinRT and on INTEGRITY, the returned value is the + QTcpSocket socket descriptor and the type is defined by + \l{QTcpSocket::socketDescriptor}{socketDescriptor}. + + \li On all other UNIX-like operating systems, the type is + a file descriptor representing a socket. + \endlist \sa setSocketDescriptor() */ diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp index 312c934632..ae94cb9d51 100644 --- a/src/network/socket/qlocalsocket_win.cpp +++ b/src/network/socket/qlocalsocket_win.cpp @@ -183,10 +183,8 @@ void QLocalSocket::connectToServer(OpenMode openMode) } // we have a valid handle - if (setSocketDescriptor((qintptr)localSocket, ConnectedState, openMode)) { - d->handle = localSocket; + if (setSocketDescriptor((qintptr)localSocket, ConnectedState, openMode)) emit connected(); - } } // This is reading from the buffer diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp index 3cf65b3553..13ceb4c612 100644 --- a/src/network/socket/qnativesocketengine_unix.cpp +++ b/src/network/socket/qnativesocketengine_unix.cpp @@ -670,8 +670,7 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d, Q_IPV6ADDR ip6 = groupAddress.toIPv6Address(); memcpy(&mreq6.ipv6mr_multiaddr, &ip6, sizeof(ip6)); mreq6.ipv6mr_interface = interface.index(); - } else - if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol) { + } else if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol) { level = IPPROTO_IP; sockOpt = how4; sockArg = &mreq4; diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp index eb633eb1d2..e21bf29d4b 100644 --- a/src/network/socket/qnativesocketengine_win.cpp +++ b/src/network/socket/qnativesocketengine_win.cpp @@ -944,9 +944,7 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d, Q_IPV6ADDR ip6 = groupAddress.toIPv6Address(); memcpy(&mreq6.ipv6mr_multiaddr, &ip6, sizeof(ip6)); mreq6.ipv6mr_interface = iface.index(); - } else - - if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol) { + } else if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol) { level = IPPROTO_IP; sockOpt = how4; sockArg = reinterpret_cast<char *>(&mreq4); diff --git a/src/network/socket/qtcpserver_p.h b/src/network/socket/qtcpserver_p.h index 71dc4d985f..b7fae4c105 100644 --- a/src/network/socket/qtcpserver_p.h +++ b/src/network/socket/qtcpserver_p.h @@ -63,7 +63,8 @@ QT_BEGIN_NAMESPACE -class QTcpServerPrivate : public QObjectPrivate, public QAbstractSocketEngineReceiver +class Q_NETWORK_EXPORT QTcpServerPrivate : public QObjectPrivate, + public QAbstractSocketEngineReceiver { Q_DECLARE_PUBLIC(QTcpServer) public: |