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)
10#include <QtNetwork/qabstractsocket.h>
11#endif
12#ifdef Q_QDOC
13#include <QtNetwork/qhostaddress.h>
14#endif
15#include <QtCore/qiodevice.h>
16#include <QtCore/qobject.h>
17
18QT_BEGIN_NAMESPACE
19
20class QDebug;
21
22class QHostAddress;
23#ifndef QT_NO_NETWORKPROXY
24class QNetworkProxy;
25#endif
26class QAbstractSocketPrivate;
27class QAuthenticator;
28
29class Q_NETWORK_EXPORT QAbstractSocket : public QIODevice
30{
31 Q_OBJECT
32 Q_MOC_INCLUDE(<QtNetwork/qauthenticator.h>)
33
34public:
35 enum SocketType {
36 TcpSocket,
37 UdpSocket,
38 SctpSocket,
39 UnknownSocketType = -1
40 };
41 Q_ENUM(SocketType)
42
43#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
44 enum NetworkLayerProtocol {
45 IPv4Protocol,
46 IPv6Protocol,
47 AnyIPProtocol,
48 UnknownNetworkLayerProtocol = -1
49 };
50 Q_ENUM(NetworkLayerProtocol)
51#else
52 // compatibility with Qt 4 to 6
53 using NetworkLayerProtocol = QHostAddress::NetworkLayerProtocol;
54 static constexpr auto IPv4Protocol = QHostAddress::IPv4Protocol;
55 static constexpr auto IPv6Protocol = QHostAddress::IPv6Protocol;
56 static constexpr auto AnyIPProtocol = QHostAddress::AnyIPProtocol;
57 static constexpr auto UnknownNetworkLayerProtocol = QHostAddress::UnknownNetworkLayerProtocol;
58#endif
59
60 enum SocketError {
61 ConnectionRefusedError,
62 RemoteHostClosedError,
63 HostNotFoundError,
64 SocketAccessError,
65 SocketResourceError,
66 SocketTimeoutError, /* 5 */
67 DatagramTooLargeError,
68 NetworkError,
69 AddressInUseError,
70 SocketAddressNotAvailableError,
71 UnsupportedSocketOperationError, /* 10 */
72 UnfinishedSocketOperationError,
73 ProxyAuthenticationRequiredError,
74 SslHandshakeFailedError,
75 ProxyConnectionRefusedError,
76 ProxyConnectionClosedError, /* 15 */
77 ProxyConnectionTimeoutError,
78 ProxyNotFoundError,
79 ProxyProtocolError,
80 OperationError,
81 SslInternalError, /* 20 */
82 SslInvalidUserDataError,
83 TemporaryError,
84
85 UnknownSocketError = -1
86 };
87 Q_ENUM(SocketError)
88 enum SocketState {
89 UnconnectedState,
90 HostLookupState,
91 ConnectingState,
92 ConnectedState,
93 BoundState,
94 ListeningState,
95 ClosingState
96 };
97 Q_ENUM(SocketState)
98 enum SocketOption {
99 LowDelayOption, // TCP_NODELAY
100 KeepAliveOption, // SO_KEEPALIVE
101 MulticastTtlOption, // IP_MULTICAST_TTL
102 MulticastLoopbackOption, // IP_MULTICAST_LOOPBACK
103 TypeOfServiceOption, //IP_TOS
104 SendBufferSizeSocketOption, //SO_SNDBUF
105 ReceiveBufferSizeSocketOption, //SO_RCVBUF
106 PathMtuSocketOption // IP_MTU
107 };
108 Q_ENUM(SocketOption)
109 enum BindFlag {
110 DefaultForPlatform = 0x0,
111 ShareAddress = 0x1,
112 DontShareAddress = 0x2,
113 ReuseAddressHint = 0x4
114 };
115 Q_DECLARE_FLAGS(BindMode, BindFlag)
116 enum PauseMode {
117 PauseNever = 0x0,
118 PauseOnSslErrors = 0x1
119 };
120 Q_DECLARE_FLAGS(PauseModes, PauseMode)
121
122 QAbstractSocket(SocketType socketType, QObject *parent);
123 virtual ~QAbstractSocket();
124
125 virtual void resume(); // to continue after proxy authentication required, SSL errors etc.
126 PauseModes pauseMode() const;
127 void setPauseMode(PauseModes pauseMode);
128
129 virtual bool bind(const QHostAddress &address, quint16 port = 0,
130 BindMode mode = DefaultForPlatform);
131#if QT_VERSION >= QT_VERSION_CHECK(7,0,0) || defined(Q_QDOC)
132 bool bind(QHostAddress::SpecialAddress addr, quint16 port = 0, BindMode mode = DefaultForPlatform)
133 { return bind(QHostAddress(addr), port, mode); }
134 bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform)
135 { return bind(QHostAddress::Any, port, mode); }
136#else
137 bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform);
138#endif
139
140 virtual void connectToHost(const QString &hostName, quint16 port, OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol);
141 void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);
142 virtual void disconnectFromHost();
143
144 bool isValid() const;
145
146 qint64 bytesAvailable() const override;
147 qint64 bytesToWrite() const override;
148
149 quint16 localPort() const;
150 QHostAddress localAddress() const;
151 quint16 peerPort() const;
152 QHostAddress peerAddress() const;
153 QString peerName() const;
154
155 qint64 readBufferSize() const;
156 virtual void setReadBufferSize(qint64 size);
157
158 void abort();
159
160 virtual qintptr socketDescriptor() const;
161 virtual bool setSocketDescriptor(qintptr socketDescriptor, SocketState state = ConnectedState,
162 OpenMode openMode = ReadWrite);
163
164 virtual void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value);
165 virtual QVariant socketOption(QAbstractSocket::SocketOption option);
166
167 SocketType socketType() const;
168 SocketState state() const;
169 SocketError error() const;
170
171 // from QIODevice
172 void close() override;
173 bool isSequential() const override;
174 bool flush();
175
176 // for synchronous access
177 virtual bool waitForConnected(int msecs = 30000);
178 bool waitForReadyRead(int msecs = 30000) override;
179 bool waitForBytesWritten(int msecs = 30000) override;
180 virtual bool waitForDisconnected(int msecs = 30000);
181
182#ifndef QT_NO_NETWORKPROXY
183 void setProxy(const QNetworkProxy &networkProxy);
184 QNetworkProxy proxy() const;
185 QString protocolTag() const;
186 void setProtocolTag(const QString &tag);
187#endif
188
189Q_SIGNALS:
190 void hostFound();
191 void connected();
192 void disconnected();
193 void stateChanged(QAbstractSocket::SocketState);
194 void errorOccurred(QAbstractSocket::SocketError);
195#ifndef QT_NO_NETWORKPROXY
196 void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator);
197#endif
198
199protected:
200 qint64 readData(char *data, qint64 maxlen) override;
201 qint64 readLineData(char *data, qint64 maxlen) override;
202 qint64 skipData(qint64 maxSize) override;
203 qint64 writeData(const char *data, qint64 len) override;
204
205 void setSocketState(SocketState state);
206 void setSocketError(SocketError socketError);
207 void setLocalPort(quint16 port);
208 void setLocalAddress(const QHostAddress &address);
209 void setPeerPort(quint16 port);
210 void setPeerAddress(const QHostAddress &address);
211 void setPeerName(const QString &name);
212
213 QAbstractSocket(SocketType socketType, QAbstractSocketPrivate &dd, QObject *parent = nullptr);
214
215private:
216 Q_DECLARE_PRIVATE(QAbstractSocket)
217 Q_DISABLE_COPY_MOVE(QAbstractSocket)
218
219 Q_PRIVATE_SLOT(d_func(), void _q_connectToNextAddress())
220 Q_PRIVATE_SLOT(d_func(), void _q_startConnecting(const QHostInfo &))
221 Q_PRIVATE_SLOT(d_func(), void _q_abortConnectionAttempt())
222 Q_PRIVATE_SLOT(d_func(), void _q_testConnection())
223};
224
225
226Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractSocket::BindMode)
227Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractSocket::PauseModes)
228
229#ifndef QT_NO_DEBUG_STREAM
230Q_NETWORK_EXPORT QDebug operator<<(QDebug, QAbstractSocket::SocketError);
231Q_NETWORK_EXPORT QDebug operator<<(QDebug, QAbstractSocket::SocketState);
232#endif
233
234QT_END_NAMESPACE
235
236QT_DECL_METATYPE_EXTERN_TAGGED(QAbstractSocket::SocketState,
237 QAbstractSocket__SocketState, Q_NETWORK_EXPORT)
238QT_DECL_METATYPE_EXTERN_TAGGED(QAbstractSocket::SocketError,
239 QAbstractSocket__SocketError, Q_NETWORK_EXPORT)
240
241#endif // QABSTRACTSOCKET_H
242

source code of qtbase/src/network/socket/qabstractsocket.h