7#include "private/qnet_unix_p.h"
15#include <private/qeventdispatcher_wasm_p.h>
24#if defined QNATIVESOCKETENGINE_DEBUG
25#include <private/qdebug_p.h>
28#include <netinet/tcp.h>
31#include <sys/socket.h>
32#include <netinet/sctp.h>
35# include <net/if_dl.h>
48 memcpy(&tmp, &
s->a6.sin6_addr,
sizeof(tmp));
53#if QT_CONFIG(networkinterface)
54 if (
s->a6.sin6_scope_id)
59 *
port = ntohs(
s->a6.sin6_port);
64 *
port = ntohs(
s->a4.sin_port);
67 tmpAddress.
setAddress(ntohl(
s->a4.sin_addr.s_addr));
108 level = IPPROTO_IPV6;
109 n = IPV6_MULTICAST_HOPS;
113 n = IP_MULTICAST_TTL;
118 level = IPPROTO_IPV6;
119 n = IPV6_MULTICAST_LOOP;
123 n = IP_MULTICAST_LOOP;
134 level = IPPROTO_IPV6;
135 n = IPV6_RECVPKTINFO;
140#elif defined(IP_RECVDSTADDR)
149 level = IPPROTO_IPV6;
150 n = IPV6_RECVHOPLIMIT;
162 level = IPPROTO_IPV6;
189#if defined (QNATIVESOCKETENGINE_DEBUG)
190 qDebug(
"QNativeSocketEnginePrivate::createNewSocket(%d, %d): unsupported protocol",
211 case EPROTONOSUPPORT:
229#if defined (QNATIVESOCKETENGINE_DEBUG)
230 qDebug(
"QNativeSocketEnginePrivate::createNewSocket(%d, %d) == false (%s)",
238#if defined (QNATIVESOCKETENGINE_DEBUG)
239 qDebug(
"QNativeSocketEnginePrivate::createNewSocket(%d, %d) == true",
266 sctp_initmsg sctpInitMsg;
269 &sctpInitMsgSize) == 0)
270 return int(
qMin(sctpInitMsg.sinit_num_ostreams, sctpInitMsg.sinit_max_instreams));
276#if defined(IPV6_PATHMTU) && !defined(IPV6_MTU)
283 return int(mtuinfo.ip6m_mtu);
299 return len == 1 ? qFromUnaligned<quint8>(&
v) :
v;
318#if !defined(Q_OS_VXWORKS)
321#ifdef QNATIVESOCKETENGINE_DEBUG
322 perror(
"QNativeSocketEnginePrivate::setOption(): fcntl(F_GETFL) failed");
327#ifdef QNATIVESOCKETENGINE_DEBUG
328 perror(
"QNativeSocketEnginePrivate::setOption(): fcntl(F_SETFL) failed");
337#ifdef QNATIVESOCKETENGINE_DEBUG
338 perror(
"QNativeSocketEnginePrivate::setOption(): ioctl(FIONBIO, 1) failed");
350 sctp_initmsg sctpInitMsg;
353 &sctpInitMsgSize) == 0) {
354 sctpInitMsg.sinit_num_ostreams = sctpInitMsg.sinit_max_instreams = uint16_t(
v);
356 sctpInitMsgSize) == 0;
368#if defined(SO_REUSEPORT) && !defined(Q_OS_LINUX)
385#ifdef QNATIVESOCKETENGINE_DEBUG
390 QT_SOCKLEN_T sockAddrSize;
394#if defined (QNATIVESOCKETENGINE_DEBUG)
397 if (connectResult == -1) {
445#if defined (QNATIVESOCKETENGINE_DEBUG)
446 qDebug(
"QNativeSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)",
447 addr.toString().toLatin1().constData(),
port,
449 ?
"Connection in progress" : strerror(ecopy));
455#if defined (QNATIVESOCKETENGINE_DEBUG)
456 qDebug(
"QNativeSocketEnginePrivate::nativeConnect(%s, %i) == true",
457 addr.toString().toLatin1().constData(),
port);
467 QT_SOCKLEN_T sockAddrSize;
483 aa.a4.sin_family = AF_INET;
484 aa.a4.sin_port = htons(
port);
485 aa.a4.sin_addr.s_addr = htonl(
address.toIPv4Address());
486 sockAddrSize =
sizeof(aa.a4);
490 if (bindResult < 0) {
491#if defined (QNATIVESOCKETENGINE_DEBUG)
511#if defined (QNATIVESOCKETENGINE_DEBUG)
512 qDebug(
"QNativeSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
513 address.toString().toLatin1().constData(),
port, strerror(ecopy));
519#if defined (QNATIVESOCKETENGINE_DEBUG)
520 qDebug(
"QNativeSocketEnginePrivate::nativeBind(%s, %i) == true",
530#if defined (QNATIVESOCKETENGINE_DEBUG)
542#if defined (QNATIVESOCKETENGINE_DEBUG)
543 qDebug(
"QNativeSocketEnginePrivate::nativeListen(%i) == false (%s)",
544 backlog, strerror(ecopy));
549#if defined (QNATIVESOCKETENGINE_DEBUG)
550 qDebug(
"QNativeSocketEnginePrivate::nativeListen(%i) == true", backlog);
560 if (acceptedDescriptor == -1) {
573 case EPROTONOSUPPORT:
574#if !defined(Q_OS_OPENBSD)
591#if EAGAIN != EWOULDBLOCK
603 return qintptr(acceptedDescriptor);
606#ifndef QT_NO_NETWORKINTERFACE
623 level = IPPROTO_IPV6;
626 sockArgSize =
sizeof(mreq6);
627 memset(&mreq6, 0,
sizeof(mreq6));
628 Q_IPV6ADDR ip6 = groupAddress.toIPv6Address();
629 memcpy(&mreq6.ipv6mr_multiaddr, &ip6,
sizeof(ip6));
630 mreq6.ipv6mr_interface =
interface.index();
635 sockArgSize =
sizeof(mreq4);
636 memset(&mreq4, 0,
sizeof(mreq4));
637 mreq4.imr_multiaddr.s_addr = htonl(groupAddress.toIPv4Address());
640 const QList<QNetworkAddressEntry> addressEntries =
interface.addressEntries();
656 mreq4.imr_interface.s_addr = INADDR_ANY;
665 int res = setsockopt(
d->socketDescriptor,
level, sockOpt, sockArg, sockArgSize);
711 if (::getsockopt(
socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF, &
v, &sizeofv) == -1)
716#if defined(Q_OS_SOLARIS)
717 struct in_addr
v = { 0, 0, 0, 0};
719 struct in_addr
v = { 0 };
722 if (::getsockopt(
socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, &
v, &sizeofv) == -1)
727 for (
int i = 0;
i < ifaces.size(); ++
i) {
729 QList<QNetworkAddressEntry> entries = iface.addressEntries();
730 for (
int j = 0;
j < entries.size(); ++
j) {
732 if (
entry.ip() == ipv4)
743 uint v = iface.index();
744 return (::setsockopt(
socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF, &
v,
sizeof(
v)) != -1);
748 if (iface.isValid()) {
749 QList<QNetworkAddressEntry> entries = iface.addressEntries();
750 for (
int i = 0;
i < entries.size(); ++
i) {
763 v.s_addr = INADDR_ANY;
764 return (::setsockopt(
socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, &
v,
sizeof(
v)) != -1);
775#if defined (SO_NREAD)
777 socklen_t sz =
sizeof nbytes;
786#if defined (QNATIVESOCKETENGINE_DEBUG)
787 qDebug(
"QNativeSocketEnginePrivate::nativeBytesAvailable() == %lli", available);
789 return available > 0 ? available : 0;
801 bool result = (readBytes != -1) || errno == EMSGSIZE;
803#if defined (QNATIVESOCKETENGINE_DEBUG)
804 qDebug(
"QNativeSocketEnginePrivate::nativeHasPendingDatagrams() == %s",
805 result ?
"true" :
"false");
812 ssize_t recvResult = -1;
817#elif defined(SO_NREAD)
820 socklen_t valuelen =
sizeof(
value);
822 if (recvResult != -1)
829 char udpMessagePeekBuffer[1500];
833 memset(&msg, 0,
sizeof(msg));
836 vec.iov_base = udpMessagePeekBuffer;
837 vec.iov_len =
sizeof(udpMessagePeekBuffer);
844 if (recvResult == -1 && errno == EINTR)
848 if ((msg.msg_flags & MSG_TRUNC) == 0)
852 msg.msg_iovlen *= 16;
853 if (msg.msg_iov != &vec)
854 delete[] msg.msg_iov;
855 msg.msg_iov =
new struct iovec[msg.msg_iovlen];
856 std::fill_n(msg.msg_iov, msg.msg_iovlen, vec);
859 if (msg.msg_iov != &vec)
860 delete[] msg.msg_iov;
863#if defined (QNATIVESOCKETENGINE_DEBUG)
864 qDebug(
"QNativeSocketEnginePrivate::nativePendingDatagramSize() == %zd", recvResult);
867 return qint64(recvResult);
871 QAbstractSocketEngine::PacketHeaderOptions options)
874 quintptr cbuf[(CMSG_SPACE(
sizeof(
struct in6_pktinfo)) + CMSG_SPACE(
sizeof(
int))
875#if !defined(IP_PKTINFO) && defined(IP_RECVIF) && defined(Q_OS_BSD4)
876 + CMSG_SPACE(
sizeof(sockaddr_dl))
879 + CMSG_SPACE(
sizeof(
struct sctp_sndrcvinfo))
887 memset(&msg, 0,
sizeof(msg));
888 memset(&aa, 0,
sizeof(aa));
891 vec.iov_base = maxSize ?
data : &
c;
892 vec.iov_len = maxSize ? maxSize : 1;
897 msg.msg_namelen =
sizeof(aa);
901 msg.msg_control = cbuf;
902 msg.msg_controllen =
sizeof(cbuf);
905 ssize_t recvResult = 0;
908 }
while (recvResult == -1 && errno == EINTR);
910 if (recvResult == -1) {
912#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
931 header->endOfRecord = (msg.msg_flags & MSG_EOR) != 0;
934 struct cmsghdr *cmsgptr;
937 for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr !=
nullptr;
938 cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)) {
940 if (cmsgptr->cmsg_level == IPPROTO_IPV6 && cmsgptr->cmsg_type == IPV6_PKTINFO
941 && cmsgptr->cmsg_len >= CMSG_LEN(
sizeof(in6_pktinfo))) {
942 in6_pktinfo *
info =
reinterpret_cast<in6_pktinfo *
>(CMSG_DATA(cmsgptr));
944 header->destinationAddress.setAddress(
reinterpret_cast<quint8 *
>(&
info->ipi6_addr));
951 if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_PKTINFO
952 && cmsgptr->cmsg_len >= CMSG_LEN(
sizeof(in_pktinfo))) {
953 in_pktinfo *
info =
reinterpret_cast<in_pktinfo *
>(CMSG_DATA(cmsgptr));
955 header->destinationAddress.setAddress(ntohl(
info->ipi_addr.s_addr));
959# ifdef IP_RECVDSTADDR
960 if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_RECVDSTADDR
961 && cmsgptr->cmsg_len >= CMSG_LEN(
sizeof(in_addr))) {
962 in_addr *
addr =
reinterpret_cast<in_addr *
>(CMSG_DATA(cmsgptr));
964 header->destinationAddress.setAddress(ntohl(
addr->s_addr));
967# if defined(IP_RECVIF) && defined(Q_OS_BSD4)
968 if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_RECVIF
969 && cmsgptr->cmsg_len >= CMSG_LEN(
sizeof(sockaddr_dl))) {
970 sockaddr_dl *sdl =
reinterpret_cast<sockaddr_dl *
>(CMSG_DATA(cmsgptr));
971 header->ifindex = sdl->sdl_index;
976 if (cmsgptr->cmsg_len == CMSG_LEN(
sizeof(
int))
977 && ((cmsgptr->cmsg_level == IPPROTO_IPV6 && cmsgptr->cmsg_type == IPV6_HOPLIMIT)
978 || (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_TTL))) {
979 static_assert(
sizeof(
header->hopLimit) ==
sizeof(
int));
980 memcpy(&
header->hopLimit, CMSG_DATA(cmsgptr),
sizeof(
header->hopLimit));
984 if (cmsgptr->cmsg_level == IPPROTO_SCTP && cmsgptr->cmsg_type == SCTP_SNDRCV
985 && cmsgptr->cmsg_len >= CMSG_LEN(
sizeof(sctp_sndrcvinfo))) {
986 sctp_sndrcvinfo *rcvInfo =
reinterpret_cast<sctp_sndrcvinfo *
>(CMSG_DATA(cmsgptr));
988 header->streamNumber = int(rcvInfo->sinfo_stream);
994#if defined (QNATIVESOCKETENGINE_DEBUG)
995 qDebug(
"QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli",
998 ?
header->senderAddress.toString().toLatin1().constData() :
"(unknown)",
1003 return qint64((maxSize || recvResult < 0) ? recvResult :
Q_INT64_C(0));
1009 quintptr cbuf[(CMSG_SPACE(
sizeof(
struct in6_pktinfo)) + CMSG_SPACE(
sizeof(
int))
1011 + CMSG_SPACE(
sizeof(
struct sctp_sndrcvinfo))
1015 struct cmsghdr *cmsgptr =
reinterpret_cast<struct cmsghdr *
>(cbuf);
1020 memset(&msg, 0,
sizeof(msg));
1021 memset(&aa, 0,
sizeof(aa));
1022 vec.iov_base =
const_cast<char *
>(
data);
1026 msg.msg_control = &cbuf;
1028 if (
header.destinationPort != 0) {
1029 msg.msg_name = &aa.a;
1031 &aa, &msg.msg_namelen);
1034 if (msg.msg_namelen ==
sizeof(aa.a6)) {
1035 if (
header.hopLimit != -1) {
1036 msg.msg_controllen += CMSG_SPACE(
sizeof(
int));
1037 cmsgptr->cmsg_len = CMSG_LEN(
sizeof(
int));
1038 cmsgptr->cmsg_level = IPPROTO_IPV6;
1039 cmsgptr->cmsg_type = IPV6_HOPLIMIT;
1040 memcpy(CMSG_DATA(cmsgptr), &
header.hopLimit,
sizeof(
int));
1041 cmsgptr =
reinterpret_cast<cmsghdr *
>(
reinterpret_cast<char *
>(cmsgptr) + CMSG_SPACE(
sizeof(
int)));
1043 if (
header.ifindex != 0 || !
header.senderAddress.isNull()) {
1044 struct in6_pktinfo *
data =
reinterpret_cast<in6_pktinfo *
>(CMSG_DATA(cmsgptr));
1046 msg.msg_controllen += CMSG_SPACE(
sizeof(*
data));
1047 cmsgptr->cmsg_len = CMSG_LEN(
sizeof(*
data));
1048 cmsgptr->cmsg_level = IPPROTO_IPV6;
1049 cmsgptr->cmsg_type = IPV6_PKTINFO;
1052 QIPv6Address tmp =
header.senderAddress.toIPv6Address();
1053 memcpy(&
data->ipi6_addr, &tmp,
sizeof(tmp));
1054 cmsgptr =
reinterpret_cast<cmsghdr *
>(
reinterpret_cast<char *
>(cmsgptr) + CMSG_SPACE(
sizeof(*
data)));
1057 if (
header.hopLimit != -1) {
1058 msg.msg_controllen += CMSG_SPACE(
sizeof(
int));
1059 cmsgptr->cmsg_len = CMSG_LEN(
sizeof(
int));
1060 cmsgptr->cmsg_level = IPPROTO_IP;
1061 cmsgptr->cmsg_type = IP_TTL;
1062 memcpy(CMSG_DATA(cmsgptr), &
header.hopLimit,
sizeof(
int));
1063 cmsgptr =
reinterpret_cast<cmsghdr *
>(
reinterpret_cast<char *
>(cmsgptr) + CMSG_SPACE(
sizeof(
int)));
1066#if defined(IP_PKTINFO) || defined(IP_SENDSRCADDR)
1067 if (
header.ifindex != 0 || !
header.senderAddress.isNull()) {
1069 struct in_pktinfo *
data =
reinterpret_cast<in_pktinfo *
>(CMSG_DATA(cmsgptr));
1071 cmsgptr->cmsg_type = IP_PKTINFO;
1073 data->ipi_addr.s_addr = htonl(
header.senderAddress.toIPv4Address());
1074# elif defined(IP_SENDSRCADDR)
1075 struct in_addr *
data =
reinterpret_cast<in_addr *
>(CMSG_DATA(cmsgptr));
1076 cmsgptr->cmsg_type = IP_SENDSRCADDR;
1077 data->s_addr = htonl(
header.senderAddress.toIPv4Address());
1079 cmsgptr->cmsg_level = IPPROTO_IP;
1080 msg.msg_controllen += CMSG_SPACE(
sizeof(*
data));
1081 cmsgptr->cmsg_len = CMSG_LEN(
sizeof(*
data));
1082 cmsgptr =
reinterpret_cast<cmsghdr *
>(
reinterpret_cast<char *
>(cmsgptr) + CMSG_SPACE(
sizeof(*
data)));
1088 if (
header.streamNumber != -1) {
1089 struct sctp_sndrcvinfo *
data =
reinterpret_cast<sctp_sndrcvinfo *
>(CMSG_DATA(cmsgptr));
1091 msg.msg_controllen += CMSG_SPACE(
sizeof(sctp_sndrcvinfo));
1092 cmsgptr->cmsg_len = CMSG_LEN(
sizeof(sctp_sndrcvinfo));
1093 cmsgptr->cmsg_level = IPPROTO_SCTP;
1094 cmsgptr->cmsg_type = SCTP_SNDRCV;
1095 data->sinfo_stream = uint16_t(
header.streamNumber);
1096 cmsgptr =
reinterpret_cast<cmsghdr *
>(
reinterpret_cast<char *
>(cmsgptr) + CMSG_SPACE(
sizeof(*
data)));
1100 if (msg.msg_controllen == 0)
1101 msg.msg_control =
nullptr;
1104 if (sentBytes < 0) {
1106#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
1123#if defined (QNATIVESOCKETENGINE_DEBUG)
1124 qDebug(
"QNativeSocketEngine::sendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli",
data,
1126 header.destinationAddress.toString().toLatin1().constData(),
1130 return qint64(sentBytes);
1145 QT_SOCKLEN_T sockAddrSize =
sizeof(sa);
1148 memset(&sa, 0,
sizeof(sa));
1153 switch (sa.a.sa_family) {
1165 }
else if (errno == EBADF) {
1170#if defined (IPV6_V6ONLY)
1176 socklen_t optlen =
sizeof(ipv6only);
1180 if (optlen !=
sizeof(ipv6only))
1181 qWarning(
"unexpected size of IPV6_V6ONLY socket option");
1200 if (
value == SOCK_STREAM) {
1205 sctp_status sctpStatus;
1207 sctp_event_subscribe sctpEvents;
1209 memset(&sctpEvents, 0,
sizeof(sctpEvents));
1210 sctpEvents.sctp_data_io_event = 1;
1212 &sctpStatusSize) == 0 &&
1214 sizeof(sctpEvents)) == 0) {
1230 if (
value == SOCK_DGRAM)
1236#if defined (QNATIVESOCKETENGINE_DEBUG)
1246 qDebug(
"QNativeSocketEnginePrivate::fetchConnectionParameters() local == %s:%i,"
1247 " peer == %s:%i, socket == %s - %s, inboundStreamCount == %i, outboundStreamCount == %i",
1257#if defined (QNATIVESOCKETENGINE_DEBUG)
1258 qDebug(
"QNativeSocketEngine::nativeClose()");
1268 ssize_t writtenBytes;
1271 if (writtenBytes < 0) {
1279#if EWOULDBLOCK != EAGAIN
1293#if defined (QNATIVESOCKETENGINE_DEBUG)
1294 qDebug(
"QNativeSocketEnginePrivate::nativeWrite(%p \"%s\", %llu) == %i",
data,
1298 return qint64(writtenBytes);
1305 if (!
q->isValid()) {
1306 qWarning(
"QNativeSocketEngine::nativeRead: Invalid socket");
1316#if EWOULDBLOCK-0 && EWOULDBLOCK != EAGAIN
1324#if defined(Q_OS_VXWORKS)
1343#if defined (QNATIVESOCKETENGINE_DEBUG)
1344 qDebug(
"QNativeSocketEnginePrivate::nativeRead(%p \"%s\", %llu) == %zd",
data,
1360 bool checkWrite,
bool *selectForRead,
1361 bool *selectForWrite)
const
1366 pfd.events |= POLLIN;
1369 pfd.events |= POLLOUT;
1376 if (pfd.revents & POLLNVAL) {
1381 static const short read_flags = POLLIN | POLLHUP | POLLERR;
1382 static const short write_flags = POLLOUT | POLLERR;
1384 *selectForRead = ((pfd.revents & read_flags) != 0);
1385 *selectForWrite = ((pfd.revents & write_flags) != 0);
1393 bool checkWrite,
bool *selectForRead,
1394 bool *selectForWrite)
const
1396 *selectForRead = checkRead;
1397 *selectForWrite = checkWrite;
1398 bool socketDisconnect =
false;
1400 checkWrite, selectForRead, selectForWrite,
1405 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.
qint64 remainingTime() const noexcept
Returns the remaining time in this QDeadlineTimer object in milliseconds.
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.
QString toString() const
Returns the address as a string.
NetworkLayerProtocol protocol() const
Returns the network layer protocol of the host address.
bool nativeHasPendingDatagrams() const
bool createNewSocket(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol &protocol)
QNetworkInterface nativeMulticastInterface() 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)
int nativeSelect(QDeadlineTimer deadline, bool selectForRead) const
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 &
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)
int qt_safe_poll(struct pollfd *fds, nfds_t nfds, QDeadlineTimer deadline)
#define QT_EINTR_LOOP(var, cmd)
static qint64 qt_safe_read(int fd, void *data, qint64 maxlen)
static struct pollfd qt_make_pollfd(int fd, short events)
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
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint GLuint64EXT address
GLdouble GLdouble GLdouble GLdouble q
#define QStringLiteral(str)
QDeadlineTimer deadline(30s)