Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qnativesocketengine_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// Copyright (C) 2016 Intel Corporation.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4
5#ifndef QNATIVESOCKETENGINE_P_H
6#define QNATIVESOCKETENGINE_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtNetwork/private/qtnetworkglobal_p.h>
20#include "QtNetwork/qhostaddress.h"
21#include "QtNetwork/qnetworkinterface.h"
22#include "private/qabstractsocketengine_p.h"
23#include "qplatformdefs.h"
24
25#ifndef Q_OS_WIN
26# include <netinet/in.h>
27#else
28# include <winsock2.h>
29# include <ws2tcpip.h>
30# include <mswsock.h>
31#endif
32
34
35#ifdef Q_OS_WIN
36# define QT_SOCKLEN_T int
37# define QT_SOCKOPTLEN_T int
38#endif
39
40namespace {
41namespace SetSALen {
42 template <typename T> void set(T *sa, typename std::enable_if<(&T::sa_len, true), QT_SOCKLEN_T>::type len)
43 { sa->sa_len = len; }
44 template <typename T> void set(T *sa, typename std::enable_if<(&T::sin_len, true), QT_SOCKLEN_T>::type len)
45 { sa->sin_len = len; }
46 template <typename T> void set(T *sin6, typename std::enable_if<(&T::sin6_len, true), QT_SOCKLEN_T>::type len)
47 { sin6->sin6_len = len; }
48 template <typename T> void set(T *, ...) {}
49}
50
51inline QT_SOCKLEN_T setSockaddr(sockaddr_in *sin, const QHostAddress &addr, quint16 port = 0)
52{
53 *sin = {};
54 SetSALen::set(sin, sizeof(*sin));
55 sin->sin_family = AF_INET;
56 sin->sin_port = htons(port);
57 sin->sin_addr.s_addr = htonl(addr.toIPv4Address());
58 return sizeof(*sin);
59}
60
61inline QT_SOCKLEN_T setSockaddr(sockaddr_in6 *sin6, const QHostAddress &addr, quint16 port = 0)
62{
63 *sin6 = {};
64 SetSALen::set(sin6, sizeof(*sin6));
65 sin6->sin6_family = AF_INET6;
66 sin6->sin6_port = htons(port);
67 memcpy(sin6->sin6_addr.s6_addr, addr.toIPv6Address().c, sizeof(sin6->sin6_addr));
68#if QT_CONFIG(networkinterface)
69 sin6->sin6_scope_id = QNetworkInterface::interfaceIndexFromName(addr.scopeId());
70#else
71 // it had better be a number then, if it is not empty
72 sin6->sin6_scope_id = addr.scopeId().toUInt();
73#endif
74 return sizeof(*sin6);
75}
76
77inline QT_SOCKLEN_T setSockaddr(sockaddr *sa, const QHostAddress &addr, quint16 port = 0)
78{
79 switch (addr.protocol()) {
81 return setSockaddr(reinterpret_cast<sockaddr_in *>(sa), addr, port);
82
85 return setSockaddr(reinterpret_cast<sockaddr_in6 *>(sa), addr, port);
86
88 break;
89 }
90 *sa = {};
91 sa->sa_family = AF_UNSPEC;
92 return 0;
93}
94} // unnamed namespace
95
97#ifndef QT_NO_NETWORKINTERFACE
99#endif
100
102{
104public:
105 QNativeSocketEngine(QObject *parent = nullptr);
107
109 bool initialize(qintptr socketDescriptor, QAbstractSocket::SocketState socketState = QAbstractSocket::ConnectedState) override;
110
111 qintptr socketDescriptor() const override;
112
113 bool isValid() const override;
114
115 bool connectToHost(const QHostAddress &address, quint16 port) override;
116 bool connectToHostByName(const QString &name, quint16 port) override;
117 bool bind(const QHostAddress &address, quint16 port) override;
118 bool listen(int backlog) override;
119 qintptr accept() override;
120 void close() override;
121
122 qint64 bytesAvailable() const override;
123
124 qint64 read(char *data, qint64 maxlen) override;
125 qint64 write(const char *data, qint64 len) override;
126
127#ifndef QT_NO_UDPSOCKET
128#ifndef QT_NO_NETWORKINTERFACE
129 bool joinMulticastGroup(const QHostAddress &groupAddress,
130 const QNetworkInterface &iface) override;
131 bool leaveMulticastGroup(const QHostAddress &groupAddress,
132 const QNetworkInterface &iface) override;
133 QNetworkInterface multicastInterface() const override;
134 bool setMulticastInterface(const QNetworkInterface &iface) override;
135#endif
136
137 bool hasPendingDatagrams() const override;
138 qint64 pendingDatagramSize() const override;
139#endif // QT_NO_UDPSOCKET
140
141 qint64 readDatagram(char *data, qint64 maxlen, QIpPacketHeader * = nullptr,
142 PacketHeaderOptions = WantNone) override;
143 qint64 writeDatagram(const char *data, qint64 len, const QIpPacketHeader &) override;
144 qint64 bytesToWrite() const override;
145
146#if 0 // currently unused
147 qint64 receiveBufferSize() const;
148 void setReceiveBufferSize(qint64 bufferSize);
149
150 qint64 sendBufferSize() const;
151 void setSendBufferSize(qint64 bufferSize);
152#endif
153
154 int option(SocketOption option) const override;
155 bool setOption(SocketOption option, int value) override;
156
158 bool *timedOut = nullptr) override;
160 bool *timedOut = nullptr) override;
161 bool waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
162 bool checkRead, bool checkWrite,
164 bool *timedOut = nullptr) override;
165
166 bool isReadNotificationEnabled() const override;
167 void setReadNotificationEnabled(bool enable) override;
168 bool isWriteNotificationEnabled() const override;
169 void setWriteNotificationEnabled(bool enable) override;
170 bool isExceptionNotificationEnabled() const override;
171 void setExceptionNotificationEnabled(bool enable) override;
172
173public Q_SLOTS:
174 // non-virtual override;
176
177private:
178 Q_DECLARE_PRIVATE(QNativeSocketEngine)
179 Q_DISABLE_COPY_MOVE(QNativeSocketEngine)
180};
181
183
184#endif // QNATIVESOCKETENGINE_P_H
virtual bool leaveMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)=0
virtual bool waitForRead(QDeadlineTimer deadline=QDeadlineTimer{DefaultTimeout}, bool *timedOut=nullptr)=0
virtual bool setMulticastInterface(const QNetworkInterface &iface)=0
virtual bool joinMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)=0
virtual void setWriteNotificationEnabled(bool enable)=0
virtual bool bind(const QHostAddress &address, quint16 port)=0
virtual bool isValid() const =0
virtual bool isReadNotificationEnabled() const =0
virtual bool hasPendingDatagrams() const =0
virtual bool connectToHost(const QHostAddress &address, quint16 port)=0
virtual qintptr accept()=0
virtual qint64 readDatagram(char *data, qint64 maxlen, QIpPacketHeader *header=nullptr, PacketHeaderOptions=WantNone)=0
virtual qint64 read(char *data, qint64 maxlen)=0
virtual void setReadNotificationEnabled(bool enable)=0
virtual bool waitForReadOrWrite(bool *readyToRead, bool *readyToWrite, bool checkRead, bool checkWrite, QDeadlineTimer deadline=QDeadlineTimer{DefaultTimeout}, bool *timedOut=nullptr)=0
virtual bool setOption(SocketOption option, int value)=0
virtual qint64 write(const char *data, qint64 len)=0
virtual qint64 pendingDatagramSize() const =0
virtual qintptr socketDescriptor() const =0
virtual bool connectToHostByName(const QString &name, quint16 port)=0
virtual qint64 bytesAvailable() const =0
virtual qint64 bytesToWrite() const =0
virtual void setExceptionNotificationEnabled(bool enable)=0
virtual bool isWriteNotificationEnabled() const =0
virtual void close()=0
virtual bool isExceptionNotificationEnabled() const =0
virtual qint64 writeDatagram(const char *data, qint64 len, const QIpPacketHeader &header)=0
virtual QNetworkInterface multicastInterface() const =0
SocketState
This enum describes the different states in which a socket can be.
static constexpr auto IPv4Protocol
SocketType
This enum describes the transport layer protocol.
\inmodule QtCore
The QHostAddress class provides an IP address.
@ UnknownNetworkLayerProtocol
The QNativeSocketEngine class provides low level access to a socket.
The QNetworkInterface class provides a listing of the host's IP addresses and network interfaces.
static int interfaceIndexFromName(const QString &name)
\inmodule QtCore
Definition qobject.h:103
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
Combined button and popup list for selecting options.
QT_SOCKLEN_T setSockaddr(sockaddr_in *sin, const QHostAddress &addr, quint16 port=0)
static constexpr std::chrono::seconds DefaultTimeout
static bool initialize()
Definition qctf.cpp:94
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
EGLOutputPortEXT port
#define AF_INET6
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum type
GLboolean enable
GLuint name
GLenum const void * addr
GLuint GLuint64EXT address
GLuint GLenum option
GLenum GLsizei len
#define Q_AUTOTEST_EXPORT
#define Q_OBJECT
#define Q_SLOTS
unsigned short quint16
Definition qtypes.h:48
long long qint64
Definition qtypes.h:60
ptrdiff_t qintptr
Definition qtypes.h:166
QFuture< QSet< QChar > > set
[10]
QDeadlineTimer deadline(30s)
socketLayer waitForWrite()
socketLayer listen()