7#include "private/qnet_unix_p.h"
15#include <private/qeventdispatcher_wasm_p.h>
20#ifndef QT_NO_IPV6IFNAME
37#if defined QNATIVESOCKETENGINE_DEBUG
38#include <private/qdebug_p.h>
41#include <netinet/tcp.h>
44#include <sys/socket.h>
45#include <netinet/sctp.h>
58 memcpy(&tmp, &
s->a6.sin6_addr,
sizeof(tmp));
63#if QT_CONFIG(networkinterface)
64 if (
s->a6.sin6_scope_id)
69 *
port = ntohs(
s->a6.sin6_port);
74 *
port = ntohs(
s->a4.sin_port);
77 tmpAddress.
setAddress(ntohl(
s->a4.sin_addr.s_addr));
118 level = IPPROTO_IPV6;
119 n = IPV6_MULTICAST_HOPS;
123 n = IP_MULTICAST_TTL;
128 level = IPPROTO_IPV6;
129 n = IPV6_MULTICAST_LOOP;
133 n = IP_MULTICAST_LOOP;
144 level = IPPROTO_IPV6;
145 n = IPV6_RECVPKTINFO;
150#elif defined(IP_RECVDSTADDR)
159 level = IPPROTO_IPV6;
160 n = IPV6_RECVHOPLIMIT;
172 level = IPPROTO_IPV6;
199#if defined (QNATIVESOCKETENGINE_DEBUG)
200 qDebug(
"QNativeSocketEnginePrivate::createNewSocket(%d, %d): unsupported protocol",
221 case EPROTONOSUPPORT:
239#if defined (QNATIVESOCKETENGINE_DEBUG)
240 qDebug(
"QNativeSocketEnginePrivate::createNewSocket(%d, %d) == false (%s)",
248#if defined (QNATIVESOCKETENGINE_DEBUG)
249 qDebug(
"QNativeSocketEnginePrivate::createNewSocket(%d, %d) == true",
276 sctp_initmsg sctpInitMsg;
279 &sctpInitMsgSize) == 0)
280 return int(
qMin(sctpInitMsg.sinit_num_ostreams, sctpInitMsg.sinit_max_instreams));
286#if defined(IPV6_PATHMTU) && !defined(IPV6_MTU)
293 return int(mtuinfo.ip6m_mtu);
309 return len == 1 ? qFromUnaligned<quint8>(&
v) :
v;
328#if !defined(Q_OS_VXWORKS)
331#ifdef QNATIVESOCKETENGINE_DEBUG
332 perror(
"QNativeSocketEnginePrivate::setOption(): fcntl(F_GETFL) failed");
337#ifdef QNATIVESOCKETENGINE_DEBUG
338 perror(
"QNativeSocketEnginePrivate::setOption(): fcntl(F_SETFL) failed");
347#ifdef QNATIVESOCKETENGINE_DEBUG
348 perror(
"QNativeSocketEnginePrivate::setOption(): ioctl(FIONBIO, 1) failed");
360 sctp_initmsg sctpInitMsg;
363 &sctpInitMsgSize) == 0) {
364 sctpInitMsg.sinit_num_ostreams = sctpInitMsg.sinit_max_instreams = uint16_t(
v);
366 sctpInitMsgSize) == 0;
378#if defined(SO_REUSEPORT) && !defined(Q_OS_LINUX)
395#ifdef QNATIVESOCKETENGINE_DEBUG
400 QT_SOCKLEN_T sockAddrSize;
404#if defined (QNATIVESOCKETENGINE_DEBUG)
407 if (connectResult == -1) {
454#if defined (QNATIVESOCKETENGINE_DEBUG)
455 qDebug(
"QNativeSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)",
456 addr.toString().toLatin1().constData(),
port,
458 ?
"Connection in progress" : strerror(ecopy));
464#if defined (QNATIVESOCKETENGINE_DEBUG)
465 qDebug(
"QNativeSocketEnginePrivate::nativeConnect(%s, %i) == true",
466 addr.toString().toLatin1().constData(),
port);
476 QT_SOCKLEN_T sockAddrSize;
492 aa.
a4.sin_family = AF_INET;
493 aa.
a4.sin_port = htons(
port);
494 aa.
a4.sin_addr.s_addr = htonl(
address.toIPv4Address());
495 sockAddrSize =
sizeof(aa.
a4);
499 if (bindResult < 0) {
500#if defined (QNATIVESOCKETENGINE_DEBUG)
520#if defined (QNATIVESOCKETENGINE_DEBUG)
521 qDebug(
"QNativeSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
522 address.toString().toLatin1().constData(),
port, strerror(ecopy));
528#if defined (QNATIVESOCKETENGINE_DEBUG)
529 qDebug(
"QNativeSocketEnginePrivate::nativeBind(%s, %i) == true",
539#if defined (QNATIVESOCKETENGINE_DEBUG)
551#if defined (QNATIVESOCKETENGINE_DEBUG)
552 qDebug(
"QNativeSocketEnginePrivate::nativeListen(%i) == false (%s)",
553 backlog, strerror(ecopy));
558#if defined (QNATIVESOCKETENGINE_DEBUG)
559 qDebug(
"QNativeSocketEnginePrivate::nativeListen(%i) == true", backlog);
569 if (acceptedDescriptor == -1) {
582 case EPROTONOSUPPORT:
583#if !defined(Q_OS_OPENBSD)
600#if EAGAIN != EWOULDBLOCK
612 return qintptr(acceptedDescriptor);
615#ifndef QT_NO_NETWORKINTERFACE
632 level = IPPROTO_IPV6;
635 sockArgSize =
sizeof(mreq6);
636 memset(&mreq6, 0,
sizeof(mreq6));
638 memcpy(&mreq6.ipv6mr_multiaddr, &ip6,
sizeof(ip6));
639 mreq6.ipv6mr_interface =
interface.index();
644 sockArgSize =
sizeof(mreq4);
645 memset(&mreq4, 0,
sizeof(mreq4));
646 mreq4.imr_multiaddr.s_addr = htonl(groupAddress.
toIPv4Address());
665 mreq4.imr_interface.s_addr = INADDR_ANY;
674 int res = setsockopt(
d->socketDescriptor,
level, sockOpt, sockArg, sockArgSize);
720 if (::getsockopt(
socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF, &
v, &sizeofv) == -1)
725#if defined(Q_OS_SOLARIS)
726 struct in_addr
v = { 0, 0, 0, 0};
728 struct in_addr
v = { 0 };
731 if (::getsockopt(
socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, &
v, &sizeofv) == -1)
736 for (
int i = 0;
i < ifaces.
size(); ++
i) {
739 for (
int j = 0;
j < entries.
size(); ++
j) {
741 if (
entry.ip() == ipv4)
752 uint v = iface.index();
753 return (::setsockopt(
socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF, &
v,
sizeof(
v)) != -1);
757 if (iface.isValid()) {
759 for (
int i = 0;
i < entries.
size(); ++
i) {
772 v.s_addr = INADDR_ANY;
773 return (::setsockopt(
socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, &
v,
sizeof(
v)) != -1);
784#if defined (SO_NREAD)
786 socklen_t sz =
sizeof nbytes;
795#if defined (QNATIVESOCKETENGINE_DEBUG)
796 qDebug(
"QNativeSocketEnginePrivate::nativeBytesAvailable() == %lli", available);
798 return available > 0 ? available : 0;
810 bool result = (readBytes != -1) || errno == EMSGSIZE;
812#if defined (QNATIVESOCKETENGINE_DEBUG)
813 qDebug(
"QNativeSocketEnginePrivate::nativeHasPendingDatagrams() == %s",
814 result ?
"true" :
"false");
821 ssize_t recvResult = -1;
826#elif defined(SO_NREAD)
829 socklen_t valuelen =
sizeof(
value);
831 if (recvResult != -1)
838 char udpMessagePeekBuffer[1500];
842 memset(&msg, 0,
sizeof(msg));
845 vec.iov_base = udpMessagePeekBuffer;
846 vec.iov_len =
sizeof(udpMessagePeekBuffer);
853 if (recvResult == -1 && errno == EINTR)
857 if ((msg.msg_flags & MSG_TRUNC) == 0)
861 msg.msg_iovlen *= 16;
862 if (msg.msg_iov != &vec)
863 delete[] msg.msg_iov;
864 msg.msg_iov =
new struct iovec[msg.msg_iovlen];
865 std::fill_n(msg.msg_iov, msg.msg_iovlen, vec);
868 if (msg.msg_iov != &vec)
869 delete[] msg.msg_iov;
872#if defined (QNATIVESOCKETENGINE_DEBUG)
873 qDebug(
"QNativeSocketEnginePrivate::nativePendingDatagramSize() == %zd", recvResult);
876 return qint64(recvResult);
880 QAbstractSocketEngine::PacketHeaderOptions options)
883 quintptr cbuf[(CMSG_SPACE(
sizeof(
struct in6_pktinfo)) + CMSG_SPACE(
sizeof(
int))
884#if !defined(IP_PKTINFO) && defined(IP_RECVIF) && defined(Q_OS_BSD4)
885 + CMSG_SPACE(
sizeof(sockaddr_dl))
888 + CMSG_SPACE(
sizeof(
struct sctp_sndrcvinfo))
896 memset(&msg, 0,
sizeof(msg));
897 memset(&aa, 0,
sizeof(aa));
900 vec.iov_base = maxSize ?
data : &
c;
901 vec.iov_len = maxSize ? maxSize : 1;
906 msg.msg_namelen =
sizeof(aa);
910 msg.msg_control = cbuf;
911 msg.msg_controllen =
sizeof(cbuf);
914 ssize_t recvResult = 0;
917 }
while (recvResult == -1 && errno == EINTR);
919 if (recvResult == -1) {
921#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
940 header->endOfRecord = (msg.msg_flags & MSG_EOR) != 0;
943 struct cmsghdr *cmsgptr;
946 for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr !=
nullptr;
947 cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)) {
949 if (cmsgptr->cmsg_level == IPPROTO_IPV6 && cmsgptr->cmsg_type == IPV6_PKTINFO
950 && cmsgptr->cmsg_len >= CMSG_LEN(
sizeof(in6_pktinfo))) {
951 in6_pktinfo *
info =
reinterpret_cast<in6_pktinfo *
>(CMSG_DATA(cmsgptr));
953 header->destinationAddress.setAddress(
reinterpret_cast<quint8 *
>(&
info->ipi6_addr));
960 if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_PKTINFO
961 && cmsgptr->cmsg_len >= CMSG_LEN(
sizeof(in_pktinfo))) {
962 in_pktinfo *
info =
reinterpret_cast<in_pktinfo *
>(CMSG_DATA(cmsgptr));
964 header->destinationAddress.setAddress(ntohl(
info->ipi_addr.s_addr));
968# ifdef IP_RECVDSTADDR
969 if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_RECVDSTADDR
970 && cmsgptr->cmsg_len >= CMSG_LEN(
sizeof(in_addr))) {
971 in_addr *
addr =
reinterpret_cast<in_addr *
>(CMSG_DATA(cmsgptr));
973 header->destinationAddress.setAddress(ntohl(
addr->s_addr));
976# if defined(IP_RECVIF) && defined(Q_OS_BSD4)
977 if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_RECVIF
978 && cmsgptr->cmsg_len >= CMSG_LEN(
sizeof(sockaddr_dl))) {
979 sockaddr_dl *sdl =
reinterpret_cast<sockaddr_dl *
>(CMSG_DATA(cmsgptr));
980 header->ifindex = sdl->sdl_index;
985 if (cmsgptr->cmsg_len == CMSG_LEN(
sizeof(
int))
986 && ((cmsgptr->cmsg_level == IPPROTO_IPV6 && cmsgptr->cmsg_type == IPV6_HOPLIMIT)
987 || (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_TTL))) {
988 static_assert(
sizeof(
header->hopLimit) ==
sizeof(
int));
989 memcpy(&
header->hopLimit, CMSG_DATA(cmsgptr),
sizeof(
header->hopLimit));
993 if (cmsgptr->cmsg_level == IPPROTO_SCTP && cmsgptr->cmsg_type == SCTP_SNDRCV
994 && cmsgptr->cmsg_len >= CMSG_LEN(
sizeof(sctp_sndrcvinfo))) {
995 sctp_sndrcvinfo *rcvInfo =
reinterpret_cast<sctp_sndrcvinfo *
>(CMSG_DATA(cmsgptr));
997 header->streamNumber = int(rcvInfo->sinfo_stream);
1003#if defined (QNATIVESOCKETENGINE_DEBUG)
1004 qDebug(
"QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli",
1012 return qint64((maxSize || recvResult < 0) ? recvResult :
Q_INT64_C(0));
1018 quintptr cbuf[(CMSG_SPACE(
sizeof(
struct in6_pktinfo)) + CMSG_SPACE(
sizeof(
int))
1020 + CMSG_SPACE(
sizeof(
struct sctp_sndrcvinfo))
1024 struct cmsghdr *cmsgptr =
reinterpret_cast<struct cmsghdr *
>(cbuf);
1029 memset(&msg, 0,
sizeof(msg));
1030 memset(&aa, 0,
sizeof(aa));
1031 vec.iov_base =
const_cast<char *
>(
data);
1035 msg.msg_control = &cbuf;
1037 if (
header.destinationPort != 0) {
1038 msg.msg_name = &aa.a;
1040 &aa, &msg.msg_namelen);
1043 if (msg.msg_namelen ==
sizeof(aa.a6)) {
1044 if (
header.hopLimit != -1) {
1045 msg.msg_controllen += CMSG_SPACE(
sizeof(
int));
1046 cmsgptr->cmsg_len = CMSG_LEN(
sizeof(
int));
1047 cmsgptr->cmsg_level = IPPROTO_IPV6;
1048 cmsgptr->cmsg_type = IPV6_HOPLIMIT;
1049 memcpy(CMSG_DATA(cmsgptr), &
header.hopLimit,
sizeof(
int));
1050 cmsgptr =
reinterpret_cast<cmsghdr *
>(
reinterpret_cast<char *
>(cmsgptr) + CMSG_SPACE(
sizeof(
int)));
1053 struct in6_pktinfo *
data =
reinterpret_cast<in6_pktinfo *
>(CMSG_DATA(cmsgptr));
1055 msg.msg_controllen += CMSG_SPACE(
sizeof(*
data));
1056 cmsgptr->cmsg_len = CMSG_LEN(
sizeof(*
data));
1057 cmsgptr->cmsg_level = IPPROTO_IPV6;
1058 cmsgptr->cmsg_type = IPV6_PKTINFO;
1061 QIPv6Address tmp =
header.senderAddress.toIPv6Address();
1062 memcpy(&
data->ipi6_addr, &tmp,
sizeof(tmp));
1063 cmsgptr =
reinterpret_cast<cmsghdr *
>(
reinterpret_cast<char *
>(cmsgptr) + CMSG_SPACE(
sizeof(*
data)));
1066 if (
header.hopLimit != -1) {
1067 msg.msg_controllen += CMSG_SPACE(
sizeof(
int));
1068 cmsgptr->cmsg_len = CMSG_LEN(
sizeof(
int));
1069 cmsgptr->cmsg_level = IPPROTO_IP;
1070 cmsgptr->cmsg_type = IP_TTL;
1071 memcpy(CMSG_DATA(cmsgptr), &
header.hopLimit,
sizeof(
int));
1072 cmsgptr =
reinterpret_cast<cmsghdr *
>(
reinterpret_cast<char *
>(cmsgptr) + CMSG_SPACE(
sizeof(
int)));
1075#if defined(IP_PKTINFO) || defined(IP_SENDSRCADDR)
1078 struct in_pktinfo *
data =
reinterpret_cast<in_pktinfo *
>(CMSG_DATA(cmsgptr));
1080 cmsgptr->cmsg_type = IP_PKTINFO;
1082 data->ipi_addr.s_addr = htonl(
header.senderAddress.toIPv4Address());
1083# elif defined(IP_SENDSRCADDR)
1084 struct in_addr *
data =
reinterpret_cast<in_addr *
>(CMSG_DATA(cmsgptr));
1085 cmsgptr->cmsg_type = IP_SENDSRCADDR;
1086 data->s_addr = htonl(
header.senderAddress.toIPv4Address());
1088 cmsgptr->cmsg_level = IPPROTO_IP;
1089 msg.msg_controllen += CMSG_SPACE(
sizeof(*
data));
1090 cmsgptr->cmsg_len = CMSG_LEN(
sizeof(*
data));
1091 cmsgptr =
reinterpret_cast<cmsghdr *
>(
reinterpret_cast<char *
>(cmsgptr) + CMSG_SPACE(
sizeof(*
data)));
1097 if (
header.streamNumber != -1) {
1098 struct sctp_sndrcvinfo *
data =
reinterpret_cast<sctp_sndrcvinfo *
>(CMSG_DATA(cmsgptr));
1100 msg.msg_controllen += CMSG_SPACE(
sizeof(sctp_sndrcvinfo));
1101 cmsgptr->cmsg_len = CMSG_LEN(
sizeof(sctp_sndrcvinfo));
1102 cmsgptr->cmsg_level = IPPROTO_SCTP;
1103 cmsgptr->cmsg_type = SCTP_SNDRCV;
1104 data->sinfo_stream = uint16_t(
header.streamNumber);
1105 cmsgptr =
reinterpret_cast<cmsghdr *
>(
reinterpret_cast<char *
>(cmsgptr) + CMSG_SPACE(
sizeof(*
data)));
1109 if (msg.msg_controllen == 0)
1110 msg.msg_control =
nullptr;
1113 if (sentBytes < 0) {
1115#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
1132#if defined (QNATIVESOCKETENGINE_DEBUG)
1133 qDebug(
"QNativeSocketEngine::sendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli",
data,
1139 return qint64(sentBytes);
1154 QT_SOCKLEN_T sockAddrSize =
sizeof(sa);
1157 memset(&sa, 0,
sizeof(sa));
1162 switch (sa.
a.sa_family) {
1174 }
else if (errno == EBADF) {
1179#if defined (IPV6_V6ONLY)
1185 socklen_t optlen =
sizeof(ipv6only);
1189 if (optlen !=
sizeof(ipv6only))
1190 qWarning(
"unexpected size of IPV6_V6ONLY socket option");
1209 if (
value == SOCK_STREAM) {
1214 sctp_status sctpStatus;
1216 sctp_event_subscribe sctpEvents;
1218 memset(&sctpEvents, 0,
sizeof(sctpEvents));
1219 sctpEvents.sctp_data_io_event = 1;
1221 &sctpStatusSize) == 0 &&
1223 sizeof(sctpEvents)) == 0) {
1239 if (
value == SOCK_DGRAM)
1245#if defined (QNATIVESOCKETENGINE_DEBUG)
1255 qDebug(
"QNativeSocketEnginePrivate::fetchConnectionParameters() local == %s:%i,"
1256 " peer == %s:%i, socket == %s - %s, inboundStreamCount == %i, outboundStreamCount == %i",
1266#if defined (QNATIVESOCKETENGINE_DEBUG)
1267 qDebug(
"QNativeSocketEngine::nativeClose()");
1277 ssize_t writtenBytes;
1280 if (writtenBytes < 0) {
1299#if defined (QNATIVESOCKETENGINE_DEBUG)
1300 qDebug(
"QNativeSocketEnginePrivate::nativeWrite(%p \"%s\", %llu) == %i",
data,
1304 return qint64(writtenBytes);
1311 if (!
q->isValid()) {
1312 qWarning(
"QNativeSocketEngine::nativeRead: Invalid socket");
1322#if EWOULDBLOCK-0 && EWOULDBLOCK != EAGAIN
1330#if defined(Q_OS_VXWORKS)
1349#if defined (QNATIVESOCKETENGINE_DEBUG)
1350 qDebug(
"QNativeSocketEnginePrivate::nativeRead(%p \"%s\", %llu) == %zd",
data,
1366 bool *selectForRead,
bool *selectForWrite)
const
1371 pfd.events |= POLLIN;
1374 pfd.events |= POLLOUT;
1381 if (pfd.revents & POLLNVAL) {
1386 static const short read_flags = POLLIN | POLLHUP | POLLERR;
1387 static const short write_flags = POLLOUT | POLLERR;
1389 *selectForRead = ((pfd.revents & read_flags) != 0);
1390 *selectForWrite = ((pfd.revents & write_flags) != 0);
1398 bool *selectForRead,
bool *selectForWrite)
const
1400 *selectForRead = checkRead;
1401 *selectForWrite = checkWrite;
1402 bool socketDisconnect =
false;
1407 if (socketDisconnect)
QAbstractSocketEngineReceiver * receiver
QAbstractSocket::NetworkLayerProtocol socketProtocol
QHostAddress localAddress
QAbstractSocket::SocketState socketState
QAbstractSocket::SocketError socketError
QString socketErrorString
QAbstractSocket::SocketType socketType
virtual void closeNotification()=0
@ WantDatagramDestination
@ MulticastLoopbackOption
@ NonBlockingSocketOption
@ ReceiveBufferSocketOption
@ ReceivePacketInformation
static constexpr auto IPv4Protocol
static constexpr auto UnknownNetworkLayerProtocol
static constexpr auto AnyIPProtocol
@ SocketAddressNotAvailableError
@ UnsupportedSocketOperationError
@ UnfinishedSocketOperationError
static constexpr auto IPv6Protocol
SocketType
This enum describes the transport layer protocol.
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
static void socketSelect(int timeout, int socket, bool waitForRead, bool waitForWrite, bool *selectForRead, bool *selectForWrite, bool *socketDisconnect)
The QHostAddress class provides an IP address.
quint32 toIPv4Address(bool *ok=nullptr) const
Returns the IPv4 address as a number.
void clear()
Sets the host address to null and sets the protocol to QAbstractSocket::UnknownNetworkLayerProtocol.
void setAddress(quint32 ip4Addr)
Set the IPv4 address specified by ip4Addr.
Q_IPV6ADDR toIPv6Address() const
Returns the IPv6 address as a Q_IPV6ADDR structure.
void setScopeId(const QString &id)
QString toString() const
Returns the address as a string.
NetworkLayerProtocol protocol() const
Returns the network layer protocol of the host address.
qsizetype size() const noexcept
const_reference at(qsizetype i) const noexcept
bool nativeHasPendingDatagrams() const
bool createNewSocket(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol &protocol)
QNetworkInterface nativeMulticastInterface() const
int nativeSelect(int timeout, bool selectForRead) const
qint64 nativeBytesAvailable() const
qint64 nativeWrite(const char *data, qint64 length)
int option(QNativeSocketEngine::SocketOption option) const
bool nativeJoinMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)
bool setOption(QNativeSocketEngine::SocketOption option, int value)
void setError(QAbstractSocket::SocketError error, ErrorString errorString) const
bool nativeSetMulticastInterface(const QNetworkInterface &iface)
bool fetchConnectionParameters()
Fetches information about both ends of the connection: whatever is available.
bool nativeBind(const QHostAddress &address, quint16 port)
qint64 nativePendingDatagramSize() const
bool nativeListen(int backlog)
qint64 nativeSendDatagram(const char *data, qint64 length, const QIpPacketHeader &header)
bool nativeConnect(const QHostAddress &address, quint16 port)
void setPortAndAddress(quint16 port, const QHostAddress &address, qt_sockaddr *aa, QT_SOCKLEN_T *sockAddrSize)
bool nativeLeaveMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)
qint64 nativeRead(char *data, qint64 maxLength)
qint64 nativeReceiveDatagram(char *data, qint64 maxLength, QIpPacketHeader *header, QAbstractSocketEngine::PacketHeaderOptions options)
@ NetworkUnreachableErrorString
@ DatagramTooLargeErrorString
@ HostUnreachableErrorString
@ AddressProtectedErrorString
@ OperationUnsupportedErrorString
@ ReceiveDatagramErrorString
@ AddressNotAvailableErrorString
@ RemoteHostClosedErrorString
@ InvalidSocketErrorString
@ ConnectionTimeOutErrorString
@ ConnectionRefusedErrorString
@ AddressInuseErrorString
@ ProtocolUnsupportedErrorString
@ SendDatagramErrorString
@ UnknownSocketErrorString
The QNativeSocketEngine class provides low level access to a socket.
The QNetworkAddressEntry class stores one IP address supported by a network interface,...
The QNetworkInterface class provides a listing of the host's IP addresses and network interfaces.
static QNetworkInterface interfaceFromIndex(int index)
Returns a QNetworkInterface object for the interface whose internal ID is index.
static QString interfaceNameFromIndex(int index)
static QList< QNetworkInterface > allInterfaces()
Returns a listing of all the network interfaces found on the host machine.
\macro QT_RESTRICTED_CAST_FROM_ASCII
QByteArray toLatin1() const &
void clear()
Clears the contents of the string and makes it null.
bool isNull() const
Returns true if this string is null; otherwise returns false.
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Combined button and popup list for selecting options.
Q_CORE_EXPORT QByteArray toPrintable(const char *data, qint64 len, qsizetype maxSize)
#define QT_WARNING_DISABLE_CLANG(text)
static qint64 qt_safe_read(int fd, void *data, qint64 maxlen)
static struct pollfd qt_make_pollfd(int fd, short events)
static int qt_poll_msecs(struct pollfd *fds, nfds_t nfds, int timeout)
#define EINTR_LOOP(var, cmd)
static int qt_safe_close(int fd)
static qint64 qt_safe_write_nosignal(int fd, const void *data, qint64 len)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char * interface
static QString header(const QString &name)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static QT_BEGIN_NAMESPACE const char * socketType(QSocketNotifier::Type type)
Q_DECL_COLD_FUNCTION Q_CORE_EXPORT QString qt_error_string(int errorCode=-1)
constexpr const T & qMin(const T &a, const T &b)
static void convertToLevelAndOption(QNativeSocketEngine::SocketOption opt, QAbstractSocket::NetworkLayerProtocol socketProtocol, int &level, int &n)
static QT_BEGIN_NAMESPACE void qt_socket_getPortAndAddress(const qt_sockaddr *s, quint16 *port, QHostAddress *addr)
static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d, int how6, int how4, const QHostAddress &groupAddress, const QNetworkInterface &interface)
static int qt_safe_ioctl(int sockfd, unsigned long request, T arg)
static int qt_safe_listen(int s, int backlog)
static int qt_safe_sendmsg(int sockfd, const struct msghdr *msg, int flags)
static int qt_safe_socket(int domain, int type, int protocol, int flags=0)
static int qt_safe_accept(int s, struct sockaddr *addr, QT_SOCKLEN_T *addrlen, int flags=0)
static int qt_safe_connect(int sockfd, const struct sockaddr *addr, QT_SOCKLEN_T addrlen)
GLsizei const GLfloat * v
[13]
GLenum GLuint GLint level
GLbitfield GLuint64 timeout
[4]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint GLuint64EXT address
GLdouble GLdouble GLdouble GLdouble q
#define QStringLiteral(str)
QFileInfo info(fileName)
[8]