Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qabstractsocket.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QABSTRACTSOCKET_H
6#define QABSTRACTSOCKET_H
7
8#include <QtNetwork/qtnetworkglobal.h>
9#if QT_VERSION >= QT_VERSION_CHECK(7, 0, 0) || defined(Q_QDOC)
10#include <QtNetwork/qhostaddress.h>
11#endif
12#include <QtCore/qiodevice.h>
13#include <QtCore/qobject.h>
14
16
17class QDebug;
18
19class QHostAddress;
20#ifndef QT_NO_NETWORKPROXY
21class QNetworkProxy;
22#endif
23class QAbstractSocketPrivate;
24class QAuthenticator;
25
26class Q_NETWORK_EXPORT QAbstractSocket : public QIODevice
27{
28 Q_OBJECT
29
30public:
31 enum SocketType {
32 TcpSocket,
33 UdpSocket,
34 SctpSocket,
35 UnknownSocketType = -1
36 };
37 Q_ENUM(SocketType)
38
39#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
40 enum NetworkLayerProtocol {
41 IPv4Protocol,
42 IPv6Protocol,
43 AnyIPProtocol,
44 UnknownNetworkLayerProtocol = -1
45 };
46 Q_ENUM(NetworkLayerProtocol)
47#else
48 // compatibility with Qt 4 to 6
49 using NetworkLayerProtocol = QHostAddress::NetworkLayerProtocol;
50 using enum NetworkLayerProtocol;
51#endif
52
53 enum SocketError {
54 ConnectionRefusedError,
55 RemoteHostClosedError,
56 HostNotFoundError,
57 SocketAccessError,
58 SocketResourceError,
59 SocketTimeoutError, /* 5 */
60 DatagramTooLargeError,
61 NetworkError,
62 AddressInUseError,
63 SocketAddressNotAvailableError,
64 UnsupportedSocketOperationError, /* 10 */
65 UnfinishedSocketOperationError,
66 ProxyAuthenticationRequiredError,
67 SslHandshakeFailedError,
68 ProxyConnectionRefusedError,
69 ProxyConnectionClosedError, /* 15 */
70 ProxyConnectionTimeoutError,
71 ProxyNotFoundError,
72 ProxyProtocolError,
73 OperationError,
74 SslInternalError, /* 20 */
75 SslInvalidUserDataError,
76 TemporaryError,
77
78 UnknownSocketError = -1
79 };
80 Q_ENUM(SocketError)
81 enum SocketState {
82 UnconnectedState,
83 HostLookupState,
84 ConnectingState,
85 ConnectedState,
86 BoundState,
87 ListeningState,
88 ClosingState
89 };
90 Q_ENUM(SocketState)
91 enum SocketOption {
92 LowDelayOption, // TCP_NODELAY
93 KeepAliveOption, // SO_KEEPALIVE
94 MulticastTtlOption, // IP_MULTICAST_TTL
95 MulticastLoopbackOption, // IP_MULTICAST_LOOPBACK
96 TypeOfServiceOption, //IP_TOS
97 SendBufferSizeSocketOption, //SO_SNDBUF
98 ReceiveBufferSizeSocketOption, //SO_RCVBUF
99 PathMtuSocketOption, // IP_MTU
100 KeepAliveIdleOption, // TCP_KEEPIDLE
101 KeepAliveIntervalOption, // TCP_KEEPINTVL
102 KeepAliveCountOption, // TCP_KEEPCNT
103 };
104 Q_ENUM(SocketOption)
105 enum BindFlag {
106 DefaultForPlatform = 0x0,
107 ShareAddress = 0x1,
108 DontShareAddress = 0x2,
109 ReuseAddressHint = 0x4
110 };
111 Q_DECLARE_FLAGS(BindMode, BindFlag)
112 enum PauseMode {
113 PauseNever = 0x0,
114 PauseOnSslErrors = 0x1
115 };
116 Q_DECLARE_FLAGS(PauseModes, PauseMode)
117
118 QAbstractSocket(SocketType socketType, QObject *parent);
119 virtual ~QAbstractSocket();
120
121 virtual void resume(); // to continue after proxy authentication required, SSL errors etc.
122 PauseModes pauseMode() const;
123 void setPauseMode(PauseModes pauseMode);
124
125 virtual bool bind(const QHostAddress &address, quint16 port = 0,
126 BindMode mode = DefaultForPlatform);
127#if QT_VERSION >= QT_VERSION_CHECK(7,0,0) || defined(Q_QDOC)
128 bool bind(QHostAddress::SpecialAddress addr, quint16 port = 0, BindMode mode = DefaultForPlatform)
129 { return bind(QHostAddress(addr), port, mode); }
130 bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform)
131 { return bind(QHostAddress::Any, port, mode); }
132#else
133 bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform);
134#endif
135
136 virtual void connectToHost(const QString &hostName, quint16 port, OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol);
137 void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);
138 virtual void disconnectFromHost();
139
140 bool isValid() const;
141
142 qint64 bytesAvailable() const override;
143 qint64 bytesToWrite() const override;
144
145 quint16 localPort() const;
146 QHostAddress localAddress() const;
147 quint16 peerPort() const;
148 QHostAddress peerAddress() const;
149 QString peerName() const;
150
151 qint64 readBufferSize() const;
152 virtual void setReadBufferSize(qint64 size);
153
154 void abort();
155
156 virtual qintptr socketDescriptor() const;
157 virtual bool setSocketDescriptor(qintptr socketDescriptor, SocketState state = ConnectedState,
158 OpenMode openMode = ReadWrite);
159
160 virtual void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value);
161 virtual QVariant socketOption(QAbstractSocket::SocketOption option);
162
163 SocketType socketType() const;
164 SocketState state() const;
165 SocketError error() const;
166
167 // from QIODevice
168 void close() override;
169 bool isSequential() const override;
170 bool flush();
171
172 // for synchronous access
173 using QIODevice::waitForBytesWritten;
174 using QIODevice::waitForReadyRead;
175 QT7_ONLY(virtual) bool waitForConnected(QDeadlineTimer timer = std::chrono::seconds(30));
176 bool waitForReadyRead(QDeadlineTimer timer = std::chrono::seconds(30)) QT7_ONLY(override);
177 bool waitForBytesWritten(QDeadlineTimer timer = std::chrono::seconds(30)) QT7_ONLY(override);
178 QT7_ONLY(virtual) bool waitForDisconnected(QDeadlineTimer timer = std::chrono::seconds(30));
179
180#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
181 virtual bool waitForConnected(int msecs);
182 bool waitForReadyRead(int msecs) override;
183 bool waitForBytesWritten(int msecs) override;
184 virtual bool waitForDisconnected(int msecs);
185#else
186 WaitForVirtualParametersChanged waitForConnected(int msecs)
187 { return waitForConnected(QDeadlineTimer(msecs)); }
188 WaitForVirtualParametersChanged waitForDisconnected(int msecs)
189 { return waitForDisconnected(QDeadlineTimer(msecs)); }
190#endif
191
192#ifndef QT_NO_NETWORKPROXY
193 void setProxy(const QNetworkProxy &networkProxy);
194 QNetworkProxy proxy() const;
195 QString protocolTag() const;
196 void setProtocolTag(const QString &tag);
197#endif
198
199Q_SIGNALS:
200 void hostFound();
201 void connected();
202 void disconnected();
203 void stateChanged(QAbstractSocket::SocketState);
204 void errorOccurred(QAbstractSocket::SocketError);
205#ifndef QT_NO_NETWORKPROXY
206 void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator);
207#endif
208
209protected:
210 qint64 readData(char *data, qint64 maxlen) override;
211 qint64 readLineData(char *data, qint64 maxlen) override;
212 qint64 skipData(qint64 maxSize) override;
213 qint64 writeData(const char *data, qint64 len) override;
214
215 void setSocketState(SocketState state);
216 void setSocketError(SocketError socketError);
217 void setLocalPort(quint16 port);
218 void setLocalAddress(const QHostAddress &address);
219 void setPeerPort(quint16 port);
220 void setPeerAddress(const QHostAddress &address);
221 void setPeerName(const QString &name);
222
223 QAbstractSocket(SocketType socketType, QAbstractSocketPrivate &dd, QObject *parent = nullptr);
224
225private:
226 Q_DECLARE_PRIVATE(QAbstractSocket)
227 Q_DISABLE_COPY_MOVE(QAbstractSocket)
228
229 Q_PRIVATE_SLOT(d_func(), void _q_connectToNextAddress())
230 Q_PRIVATE_SLOT(d_func(), void _q_startConnecting(const QHostInfo &))
231 Q_PRIVATE_SLOT(d_func(), void _q_abortConnectionAttempt())
232 Q_PRIVATE_SLOT(d_func(), void _q_testConnection())
233};
234
235
236Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractSocket::BindMode)
237Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractSocket::PauseModes)
238
239#if QT_NETWORK_REMOVED_SINCE(6, 12)
240#ifndef QT_NO_DEBUG_STREAM
241Q_NETWORK_EXPORT QDebug operator<<(QDebug, QAbstractSocket::SocketError);
242Q_NETWORK_EXPORT QDebug operator<<(QDebug, QAbstractSocket::SocketState);
243#endif
244#endif // QT_NETWORK_REMOVED_SINCE(6, 12)
245
246QT_END_NAMESPACE
247
248QT_DECL_METATYPE_EXTERN_TAGGED(QAbstractSocket::SocketState,
249 QAbstractSocket__SocketState, Q_NETWORK_EXPORT)
250QT_DECL_METATYPE_EXTERN_TAGGED(QAbstractSocket::SocketError,
251 QAbstractSocket__SocketError, Q_NETWORK_EXPORT)
252
253#endif // QABSTRACTSOCKET_H
The QAbstractSocket class provides the base functionality common to all socket types.
\inmodule QtCore\reentrant
Definition qdatastream.h:50
bool parse(const QString &ipString)
void setAddress(const quint8 *a_)
AddressClassification classify() const
void setAddress(const Q_IPV6ADDR &a_)
static AddressClassification classify(const QHostAddress &address)
void setAddress(quint32 a_=0)
The QHostAddress class provides an IP address.
QDataStream & operator>>(QDataStream &in, QHostAddress &address)
Reads a host address into address from the stream in and returns a reference to the stream.
bool setAddress(const QHostAddress &address)
int prefixLength() const
void setPrefixLength(QAbstractSocket::NetworkLayerProtocol proto, int len)
constexpr QNetmask()
QHostAddress address(QAbstractSocket::NetworkLayerProtocol protocol) const
friend bool operator==(QNetmask n1, QNetmask n2)
Combined button and popup list for selecting options.
static bool convertToIpv4(quint32 &a, const Q_IPV6ADDR &a6, const QHostAddress::ConversionMode mode)
size_t qHash(const QHostAddress &key, size_t seed) noexcept
static bool parseIp6(const QString &address, QIPAddressUtils::IPv6Address &addr, QString *scopeId)
static void clearBits(quint8 *where, int start, int end)
QIPv6Address Q_IPV6ADDR
#define AF_INET6