11#include <qabstracteventdispatcher.h>
12#include <qsocketnotifier.h>
15#include <qnetworkinterface.h>
16#include <qoperatingsystemversion.h>
17#include <qvarlengtharray.h>
23#if defined(QNATIVESOCKETENGINE_DEBUG)
24#include <private/qdebug_p.h>
38#if defined(QNATIVESOCKETENGINE_DEBUG)
40void verboseWSErrorDebug(
int r)
43 case WSANOTINITIALISED : qDebug(
"WSA error : WSANOTINITIALISED");
break;
44 case WSAEINTR: qDebug(
"WSA error : WSAEINTR");
break;
45 case WSAEBADF: qDebug(
"WSA error : WSAEBADF");
break;
46 case WSAEACCES: qDebug(
"WSA error : WSAEACCES");
break;
47 case WSAEFAULT: qDebug(
"WSA error : WSAEFAULT");
break;
48 case WSAEINVAL: qDebug(
"WSA error : WSAEINVAL");
break;
49 case WSAEMFILE: qDebug(
"WSA error : WSAEMFILE");
break;
50 case WSAEWOULDBLOCK: qDebug(
"WSA error : WSAEWOULDBLOCK");
break;
51 case WSAEINPROGRESS: qDebug(
"WSA error : WSAEINPROGRESS");
break;
52 case WSAEALREADY: qDebug(
"WSA error : WSAEALREADY");
break;
53 case WSAENOTSOCK: qDebug(
"WSA error : WSAENOTSOCK");
break;
54 case WSAEDESTADDRREQ: qDebug(
"WSA error : WSAEDESTADDRREQ");
break;
55 case WSAEMSGSIZE: qDebug(
"WSA error : WSAEMSGSIZE");
break;
56 case WSAEPROTOTYPE: qDebug(
"WSA error : WSAEPROTOTYPE");
break;
57 case WSAENOPROTOOPT: qDebug(
"WSA error : WSAENOPROTOOPT");
break;
58 case WSAEPROTONOSUPPORT: qDebug(
"WSA error : WSAEPROTONOSUPPORT");
break;
59 case WSAESOCKTNOSUPPORT: qDebug(
"WSA error : WSAESOCKTNOSUPPORT");
break;
60 case WSAEOPNOTSUPP: qDebug(
"WSA error : WSAEOPNOTSUPP");
break;
61 case WSAEPFNOSUPPORT: qDebug(
"WSA error : WSAEPFNOSUPPORT");
break;
62 case WSAEAFNOSUPPORT: qDebug(
"WSA error : WSAEAFNOSUPPORT");
break;
63 case WSAEADDRINUSE: qDebug(
"WSA error : WSAEADDRINUSE");
break;
64 case WSAEADDRNOTAVAIL: qDebug(
"WSA error : WSAEADDRNOTAVAIL");
break;
65 case WSAENETDOWN: qDebug(
"WSA error : WSAENETDOWN");
break;
66 case WSAENETUNREACH: qDebug(
"WSA error : WSAENETUNREACH");
break;
67 case WSAENETRESET: qDebug(
"WSA error : WSAENETRESET");
break;
68 case WSAECONNABORTED: qDebug(
"WSA error : WSAECONNABORTED");
break;
69 case WSAECONNRESET: qDebug(
"WSA error : WSAECONNRESET");
break;
70 case WSAENOBUFS: qDebug(
"WSA error : WSAENOBUFS");
break;
71 case WSAEISCONN: qDebug(
"WSA error : WSAEISCONN");
break;
72 case WSAENOTCONN: qDebug(
"WSA error : WSAENOTCONN");
break;
73 case WSAESHUTDOWN: qDebug(
"WSA error : WSAESHUTDOWN");
break;
74 case WSAETOOMANYREFS: qDebug(
"WSA error : WSAETOOMANYREFS");
break;
75 case WSAETIMEDOUT: qDebug(
"WSA error : WSAETIMEDOUT");
break;
76 case WSAECONNREFUSED: qDebug(
"WSA error : WSAECONNREFUSED");
break;
77 case WSAELOOP: qDebug(
"WSA error : WSAELOOP");
break;
78 case WSAENAMETOOLONG: qDebug(
"WSA error : WSAENAMETOOLONG");
break;
79 case WSAEHOSTDOWN: qDebug(
"WSA error : WSAEHOSTDOWN");
break;
80 case WSAEHOSTUNREACH: qDebug(
"WSA error : WSAEHOSTUNREACH");
break;
81 case WSAENOTEMPTY: qDebug(
"WSA error : WSAENOTEMPTY");
break;
82 case WSAEPROCLIM: qDebug(
"WSA error : WSAEPROCLIM");
break;
83 case WSAEUSERS: qDebug(
"WSA error : WSAEUSERS");
break;
84 case WSAEDQUOT: qDebug(
"WSA error : WSAEDQUOT");
break;
85 case WSAESTALE: qDebug(
"WSA error : WSAESTALE");
break;
86 case WSAEREMOTE: qDebug(
"WSA error : WSAEREMOTE");
break;
87 case WSAEDISCON: qDebug(
"WSA error : WSAEDISCON");
break;
88 default: qDebug(
"WSA error : Unknown");
break;
90 qErrnoWarning(r,
"more details");
93#define WS_ERROR_DEBUG(x) verboseWSErrorDebug(x)
97#define WS_ERROR_DEBUG(x) Q_UNUSED(x)
105#ifndef SO_EXCLUSIVEADDRUSE
106#define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR
))
110
111
112
116 const sockaddr_in6 *sa6 = &sa->a6;
118 for (
int i = 0; i < 16; ++i)
119 tmp.c[i] = sa6->sin6_addr.s6_addr[i];
123 if (sa6->sin6_scope_id)
124 a.setScopeId(QString::number(sa6->sin6_scope_id));
128 WSANtohs(socketDescriptor, sa6->sin6_port, port);
131 if (sa->a.sa_family == AF_INET) {
132 const sockaddr_in *sa4 = &sa->a4;
134 WSANtohl(socketDescriptor, sa4->sin_addr.s_addr, &addr);
140 WSANtohs(socketDescriptor, sa4->sin_port, port);
145 QAbstractSocket::NetworkLayerProtocol socketProtocol,
int &level,
int &n)
151 case QNativeSocketEngine::NonBlockingSocketOption:
152 case QNativeSocketEngine::TypeOfServiceOption:
153 case QNativeSocketEngine::MaxStreamsSocketOption:
156 case QNativeSocketEngine::BindInterfaceIndex:
159 case QNativeSocketEngine::ReceiveBufferSocketOption:
162 case QNativeSocketEngine::SendBufferSocketOption:
165 case QNativeSocketEngine::BroadcastSocketOption:
168 case QNativeSocketEngine::AddressReusable:
171 case QNativeSocketEngine::BindExclusively:
174 case QNativeSocketEngine::ReceiveOutOfBandData:
177 case QNativeSocketEngine::LowDelayOption:
181 case QNativeSocketEngine::KeepAliveOption:
184 case QNativeSocketEngine::MulticastTtlOption:
185 if (socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) {
186 level = IPPROTO_IPV6;
187 n = IPV6_MULTICAST_HOPS;
191 n = IP_MULTICAST_TTL;
194 case QNativeSocketEngine::MulticastLoopbackOption:
195 if (socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) {
196 level = IPPROTO_IPV6;
197 n = IPV6_MULTICAST_LOOP;
201 n = IP_MULTICAST_LOOP;
204 case QNativeSocketEngine::ReceivePacketInformation:
207 case QNativeSocketEngine::ReceiveHopLimit:
208 if (socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) {
209 level = IPPROTO_IPV6;
211 }
else if (socketProtocol == QAbstractSocket::IPv4Protocol) {
217 case QAbstractSocketEngine::PathMtuInformation:
223
224
228 QT_SOCKLEN_T valueSize =
sizeof(value);
229 if (::getsockopt(socketDescriptor, SOL_SOCKET, SO_TYPE,
230 reinterpret_cast<
char *>(&value), &valueSize) != 0) {
233 if (value == SOCK_STREAM)
234 return QAbstractSocket::TcpSocket;
235 else if (value == SOCK_DGRAM)
236 return QAbstractSocket::UdpSocket;
238 return QAbstractSocket::UnknownSocketType;
246#ifndef SIO_UDP_CONNRESET
248# define IOC_VENDOR 0x18000000
251# define _WSAIOW(x,y) (IOC_IN|(x)|(y))
259 if (socketType == QAbstractSocket::SctpSocket) {
260 setError(QAbstractSocket::UnsupportedSocketOperationError,
261 ProtocolUnsupportedErrorString);
266 int protocol = (socketProtocol == QAbstractSocket::IPv6Protocol
267 || (socketProtocol == QAbstractSocket::AnyIPProtocol)) ?
AF_INET6 : AF_INET;
268 int type = (socketType == QAbstractSocket::UdpSocket) ? SOCK_DGRAM : SOCK_STREAM;
274#ifndef WSA_FLAG_NO_HANDLE_INHERIT
275#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
279 if (socket == INVALID_SOCKET) {
280 int err = WSAGetLastError();
283 case WSANOTINITIALISED:
286 case WSAEAFNOSUPPORT:
287 case WSAESOCKTNOSUPPORT:
290 setError(QAbstractSocket::UnsupportedSocketOperationError, ProtocolUnsupportedErrorString);
294 setError(QAbstractSocket::SocketResourceError, ResourceErrorString);
303 if (socketType == QAbstractSocket::UdpSocket) {
306 DWORD dwBytesReturned = 0;
307 int bNewBehavior = 1;
309 NULL, 0, &dwBytesReturned, NULL, NULL) == SOCKET_ERROR) {
311 int err = WSAGetLastError();
318 GUID recvmsgguid = WSAID_WSARECVMSG;
319 if (WSAIoctl(socket, SIO_GET_EXTENSION_FUNCTION_POINTER,
320 &recvmsgguid,
sizeof(recvmsgguid),
321 &recvmsg,
sizeof(recvmsg), &bytesReturned, NULL, NULL) == SOCKET_ERROR)
324 GUID sendmsgguid = WSAID_WSASENDMSG;
325 if (WSAIoctl(socket, SIO_GET_EXTENSION_FUNCTION_POINTER,
326 &sendmsgguid,
sizeof(sendmsgguid),
327 &sendmsg,
sizeof(sendmsg), &bytesReturned, NULL, NULL) == SOCKET_ERROR)
334 reinterpret_cast<
char *>(&ipv6only),
sizeof(ipv6only));
337 socketDescriptor = socket;
338 this->socketProtocol = socketProtocol;
339 this->socketType = socketType;
342 if (!setOption(QAbstractSocketEngine::NonBlockingSocketOption, 1)) {
343 setError(QAbstractSocket::UnsupportedSocketOperationError, NonBlockingInitFailedErrorString);
352
353
354
357 Q_Q(
const QNativeSocketEngine);
363 case QNativeSocketEngine::NonBlockingSocketOption: {
364 unsigned long buf = 0;
365 if (WSAIoctl(socketDescriptor, FIONBIO, 0,0, &buf,
sizeof(buf), 0,0,0) == 0)
371 case QNativeSocketEngine::TypeOfServiceOption:
372 case QNativeSocketEngine::MaxStreamsSocketOption:
379#if Q_BYTE_ORDER != Q_LITTLE_ENDIAN
380#error code assumes windows is little endian
384 QT_SOCKOPTLEN_T len =
sizeof(v);
386 convertToLevelAndOption(opt, socketProtocol, level, n);
388 if (getsockopt(socketDescriptor, level, n, (
char *) &v, &len) == 0)
397
398
401 Q_Q(
const QNativeSocketEngine);
407 case QNativeSocketEngine::SendBufferSocketOption:
410 case QNativeSocketEngine::NonBlockingSocketOption:
412 unsigned long buf = v;
413 unsigned long outBuf;
414 DWORD sizeWritten = 0;
415 if (::WSAIoctl(socketDescriptor, FIONBIO, &buf,
sizeof(
unsigned long), &outBuf,
sizeof(
unsigned long), &sizeWritten, 0,0) == SOCKET_ERROR) {
421 case QNativeSocketEngine::TypeOfServiceOption:
422 case QNativeSocketEngine::MaxStreamsSocketOption:
425 case QNativeSocketEngine::ReceivePacketInformation: {
426 if (socketProtocol == QAbstractSocket::IPv6Protocol
427 || socketProtocol == QAbstractSocket::AnyIPProtocol) {
429 if (::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_PKTINFO,
430 reinterpret_cast<
char *>(&v),
sizeof(v)) != 0) {
437 if (::setsockopt(socketDescriptor, IPPROTO_IP, IP_PKTINFO,
438 reinterpret_cast<
char *>(&v),
sizeof(v)) != 0) {
439 if (socketProtocol == QAbstractSocket::IPv4Protocol) {
447 case QNativeSocketEngine::BindInterfaceIndex: {
449 if (socketProtocol == QAbstractSocket::IPv6Protocol
450 || socketProtocol == QAbstractSocket::AnyIPProtocol) {
454 ret = ::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_UNICAST_IF,
455 reinterpret_cast<
char *>(&v),
sizeof(v));
458 ret = ::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF,
459 reinterpret_cast<
char *>(&v),
sizeof(v));
463 const int enable = 1;
464 ret = ::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_IFLIST,
465 reinterpret_cast<
const char *>(&enable),
sizeof(enable));
467 ret = ::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_ADD_IFLIST,
468 reinterpret_cast<
char *>(&v),
sizeof(v));
478 int netIdx = htonl(v);
481 ret = ::setsockopt(socketDescriptor, IPPROTO_IP, IP_UNICAST_IF,
482 reinterpret_cast<
char *>(&netIdx),
sizeof(netIdx));
485 ret = ::setsockopt(socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF,
486 reinterpret_cast<
char *>(&netIdx),
sizeof(netIdx));
490 const int enable = 1;
491 ret = ::setsockopt(socketDescriptor, IPPROTO_IP, IP_IFLIST,
492 reinterpret_cast<
const char *>(&enable),
sizeof(enable));
495 ret = ::setsockopt(socketDescriptor, IPPROTO_IP, IP_ADD_IFLIST,
496 reinterpret_cast<
char *>(&v),
sizeof(v));
499 if (socketProtocol == QAbstractSocket::IPv4Protocol)
510 convertToLevelAndOption(opt, socketProtocol, level, n);
513 if (::setsockopt(socketDescriptor, level, n, (
char*)&v,
sizeof(v)) != 0) {
521
522
523
526
527
528
532 localAddress.clear();
535 inboundStreamCount = outboundStreamCount = 0;
537 if (socketDescriptor == -1)
541 QT_SOCKLEN_T sockAddrSize =
sizeof(sa);
544 memset(&sa, 0,
sizeof(sa));
545 if (::getsockname(socketDescriptor, &sa.a, &sockAddrSize) == 0) {
546 qt_socket_getPortAndAddress(socketDescriptor, &sa, &localPort, &localAddress);
548 switch (sa.a.sa_family) {
550 socketProtocol = QAbstractSocket::IPv4Protocol;
553 socketProtocol = QAbstractSocket::IPv6Protocol;
556 socketProtocol = QAbstractSocket::UnknownNetworkLayerProtocol;
560 int err = WSAGetLastError();
562 if (err == WSAENOTSOCK) {
563 setError(QAbstractSocket::UnsupportedSocketOperationError,
564 InvalidSocketErrorString);
571 QT_SOCKOPTLEN_T optlen =
sizeof(ipv6only);
572 if (localAddress == QHostAddress::AnyIPv6
573 && !getsockopt(socketDescriptor, IPPROTO_IPV6,
IPV6_V6ONLY, (
char*)&ipv6only, &optlen )) {
575 socketProtocol = QAbstractSocket::AnyIPProtocol;
576 localAddress = QHostAddress::Any;
584 const uchar ipv6MappedNet[] = {0,0,0,0, 0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
585 if (localAddress.isInSubnet(QHostAddress(ipv6MappedNet), 128 - 32)) {
587 const quint32 localIPv4 = localAddress.toIPv4Address(&ok);
588 if (ok && localIPv4 == INADDR_ANY) {
589 socketProtocol = QAbstractSocket::AnyIPProtocol;
590 localAddress = QHostAddress::Any;
594 memset(&sa, 0,
sizeof(sa));
595 if (::getpeername(socketDescriptor, &sa.a, &sockAddrSize) == 0) {
596 qt_socket_getPortAndAddress(socketDescriptor, &sa, &peerPort, &peerAddress);
597 inboundStreamCount = outboundStreamCount = 1;
602 socketType = qt_socket_getType(socketDescriptor);
604#if defined (QNATIVESOCKETENGINE_DEBUG)
605 QString socketProtocolStr = QStringLiteral(
"UnknownProtocol");
606 if (socketProtocol == QAbstractSocket::IPv4Protocol) socketProtocolStr = QStringLiteral(
"IPv4Protocol");
607 else if (socketProtocol == QAbstractSocket::IPv6Protocol) socketProtocolStr = QStringLiteral(
"IPv6Protocol");
609 QString socketTypeStr = QStringLiteral(
"UnknownSocketType");
610 if (socketType == QAbstractSocket::TcpSocket) socketTypeStr = QStringLiteral(
"TcpSocket");
611 else if (socketType == QAbstractSocket::UdpSocket) socketTypeStr = QStringLiteral(
"UdpSocket");
613 qDebug(
"QNativeSocketEnginePrivate::fetchConnectionParameters() localAddress == %s, localPort = %i, peerAddress == %s, peerPort = %i, socketProtocol == %s, socketType == %s", localAddress.toString().toLatin1().constData(), localPort, peerAddress.toString().toLatin1().constData(), peerPort, socketProtocolStr.toLatin1().constData(), socketTypeStr.toLatin1().constData());
625 d->socketState = QAbstractSocket::ConnectedState;
627 case WSAEHOSTUNREACH:
628 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::HostUnreachableErrorString);
629 d->socketState = QAbstractSocket::UnconnectedState;
631 case WSAEADDRNOTAVAIL:
632 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::AddressNotAvailableErrorString);
633 d->socketState = QAbstractSocket::UnconnectedState;
636 d->setError(QAbstractSocket::UnfinishedSocketOperationError, QNativeSocketEnginePrivate::InvalidSocketErrorString);
637 d->socketState = QAbstractSocket::ConnectingState;
640 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::AddressInuseErrorString);
642 case WSAECONNREFUSED:
643 d->setError(QAbstractSocket::ConnectionRefusedError, QNativeSocketEnginePrivate::ConnectionRefusedErrorString);
644 d->socketState = QAbstractSocket::UnconnectedState;
647 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::ConnectionTimeOutErrorString);
648 d->socketState = QAbstractSocket::UnconnectedState;
651 d->setError(QAbstractSocket::SocketAccessError, QNativeSocketEnginePrivate::AccessErrorString);
652 d->socketState = QAbstractSocket::UnconnectedState;
655 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::NetworkUnreachableErrorString);
656 d->socketState = QAbstractSocket::UnconnectedState;
660 d->setError(QAbstractSocket::UnfinishedSocketOperationError, QNativeSocketEnginePrivate::InvalidSocketErrorString);
670#if defined (QNATIVESOCKETENGINE_DEBUG)
671 qDebug(
"QNativeSocketEnginePrivate::nativeConnect() to %s :: %i", address.toString().toLatin1().constData(), port);
675 QT_SOCKLEN_T sockAddrSize = 0;
677 setPortAndAddress(port, address, &aa, &sockAddrSize);
679 if ((socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) && address.toIPv4Address()) {
682 ipv6only = ::setsockopt(socketDescriptor, IPPROTO_IPV6,
IPV6_V6ONLY, (
char*)&ipv6only,
sizeof(ipv6only) );
686 int connectResult = ::WSAConnect(socketDescriptor, &aa.a, sockAddrSize, 0,0,0,0);
687 if (connectResult == SOCKET_ERROR) {
688 int err = WSAGetLastError();
692 case WSANOTINITIALISED:
695 case WSAEWOULDBLOCK: {
702 QT_SOCKLEN_T valueSize =
sizeof(value);
703 bool tryAgain =
false;
704 bool errorDetected =
false;
707 if (::getsockopt(socketDescriptor, SOL_SOCKET, SO_ERROR, (
char *) &value, &valueSize) == 0) {
708 if (value != NOERROR) {
710 errorDetected =
true;
713 const int val = NO_ERROR;
714 ::setsockopt(socketDescriptor, SOL_SOCKET, SO_ERROR,
reinterpret_cast<
const char*>(&val),
sizeof val);
720 tryAgain = !tryAgain;
722 setErrorFromWSAError(value,
this);
725 }
while (tryAgain && (tries < 2));
730 err = WSAEINPROGRESS;
735 setErrorFromWSAError(err,
this);
738 if (socketState != QAbstractSocket::ConnectedState) {
739#if defined (QNATIVESOCKETENGINE_DEBUG)
740 qDebug(
"QNativeSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)",
741 address.toString().toLatin1().constData(), port,
742 socketState == QAbstractSocket::ConnectingState
743 ?
"Connection in progress" : socketErrorString.toLatin1().constData());
751#if defined (QNATIVESOCKETENGINE_DEBUG)
752 qDebug(
"QNativeSocketEnginePrivate::nativeConnect(%s, %i) == true",
753 address.toString().toLatin1().constData(), port);
756 socketState = QAbstractSocket::ConnectedState;
763 QHostAddress address = a;
764 if (address.protocol() == QAbstractSocket::IPv4Protocol) {
765 if ((address.toIPv4Address() & 0xffff0000) == 0xefff0000) {
767 address = QHostAddress(QHostAddress::AnyIPv4);
772 QT_SOCKLEN_T sockAddrSize = 0;
773 setPortAndAddress(port, address, &aa, &sockAddrSize);
778 if (address.protocol() == QAbstractSocket::IPv6Protocol)
780 ::setsockopt(socketDescriptor, IPPROTO_IPV6,
IPV6_V6ONLY, (
char*)&ipv6only,
sizeof(ipv6only) );
784 int bindResult = ::bind(socketDescriptor, &aa.a, sockAddrSize);
785 if (bindResult == SOCKET_ERROR && WSAGetLastError() == WSAEAFNOSUPPORT
786 && address.protocol() == QAbstractSocket::AnyIPProtocol) {
788 aa.a4.sin_family = AF_INET;
789 aa.a4.sin_port = htons(port);
790 aa.a4.sin_addr.s_addr = htonl(address.toIPv4Address());
791 sockAddrSize =
sizeof(aa.a4);
792 bindResult = ::bind(socketDescriptor, &aa.a, sockAddrSize);
794 if (bindResult == SOCKET_ERROR) {
795 int err = WSAGetLastError();
798 case WSANOTINITIALISED:
803 setError(QAbstractSocket::AddressInUseError, AddressInuseErrorString);
806 setError(QAbstractSocket::SocketAccessError, AddressProtectedErrorString);
808 case WSAEADDRNOTAVAIL:
809 setError(QAbstractSocket::SocketAddressNotAvailableError, AddressNotAvailableErrorString);
815#if defined (QNATIVESOCKETENGINE_DEBUG)
816 qDebug(
"QNativeSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
817 address.toString().toLatin1().constData(), port, socketErrorString.toLatin1().constData());
823#if defined (QNATIVESOCKETENGINE_DEBUG)
824 qDebug(
"QNativeSocketEnginePrivate::nativeBind(%s, %i) == true",
825 address.toString().toLatin1().constData(), port);
827 socketState = QAbstractSocket::BoundState;
834 if (::listen(socketDescriptor, backlog) == SOCKET_ERROR) {
835 int err = WSAGetLastError();
838 case WSANOTINITIALISED:
842 setError(QAbstractSocket::AddressInUseError,
843 PortInuseErrorString);
849#if defined (QNATIVESOCKETENGINE_DEBUG)
850 qDebug(
"QNativeSocketEnginePrivate::nativeListen(%i) == false (%s)",
851 backlog, socketErrorString.toLatin1().constData());
856#if defined (QNATIVESOCKETENGINE_DEBUG)
857 qDebug(
"QNativeSocketEnginePrivate::nativeListen(%i) == true", backlog);
860 socketState = QAbstractSocket::ListeningState;
866 SOCKET acceptedDescriptor = WSAAccept(socketDescriptor, 0,0,0,0);
867 if (acceptedDescriptor == INVALID_SOCKET) {
868 int err = WSAGetLastError();
871 setError(QAbstractSocket::SocketAccessError, AccessErrorString);
873 case WSAECONNREFUSED:
874 setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString);
877 setError(QAbstractSocket::NetworkError, RemoteHostClosedErrorString);
880 setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString);
883 setError(QAbstractSocket::SocketResourceError, NotSocketErrorString);
887 setError(QAbstractSocket::UnsupportedSocketOperationError, ProtocolUnsupportedErrorString);
892 setError(QAbstractSocket::SocketResourceError, ResourceErrorString);
895 setError(QAbstractSocket::TemporaryError, TemporaryErrorString);
898 setError(QAbstractSocket::UnknownSocketError, UnknownSocketErrorString);
901 }
else if (acceptedDescriptor != INVALID_SOCKET && QAbstractEventDispatcher::instance()) {
906 QSocketNotifier n(acceptedDescriptor, QSocketNotifier::Read);
910#if defined (QNATIVESOCKETENGINE_DEBUG)
911 qDebug(
"QNativeSocketEnginePrivate::nativeAccept() == %lld", qint64(acceptedDescriptor));
913 return qintptr(acceptedDescriptor);
919 const QHostAddress &groupAddress,
920 const QNetworkInterface &iface)
927 struct ip_mreq mreq4;
928 struct ipv6_mreq mreq6;
930 if (groupAddress.protocol() == QAbstractSocket::IPv6Protocol) {
931 level = IPPROTO_IPV6;
933 sockArg =
reinterpret_cast<
char *>(&mreq6);
934 sockArgSize =
sizeof(mreq6);
935 memset(&mreq6, 0,
sizeof(mreq6));
936 Q_IPV6ADDR ip6 = groupAddress.toIPv6Address();
937 memcpy(&mreq6.ipv6mr_multiaddr, &ip6,
sizeof(ip6));
938 mreq6.ipv6mr_interface = iface.index();
939 }
else if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol) {
942 sockArg =
reinterpret_cast<
char *>(&mreq4);
943 sockArgSize =
sizeof(mreq4);
944 memset(&mreq4, 0,
sizeof(mreq4));
945 mreq4.imr_multiaddr.s_addr = htonl(groupAddress.toIPv4Address());
947 if (iface.isValid()) {
948 const QList<QNetworkAddressEntry> addressEntries = iface.addressEntries();
950 for (
const QNetworkAddressEntry &entry : addressEntries) {
951 const QHostAddress ip = entry.ip();
952 if (ip.protocol() == QAbstractSocket::IPv4Protocol) {
953 mreq4.imr_interface.s_addr = htonl(ip.toIPv4Address());
959 d->setError(QAbstractSocket::NetworkError,
960 QNativeSocketEnginePrivate::NetworkUnreachableErrorString);
964 mreq4.imr_interface.s_addr = INADDR_ANY;
968 d->setError(QAbstractSocket::UnsupportedSocketOperationError,
969 QNativeSocketEnginePrivate::ProtocolUnsupportedErrorString);
973 int res = setsockopt(d->socketDescriptor, level, sockOpt, sockArg, sockArgSize);
975 d->setError(QAbstractSocket::UnsupportedSocketOperationError,
976 QNativeSocketEnginePrivate::OperationUnsupportedErrorString);
983 const QNetworkInterface &iface)
985 return multicastMembershipHelper(
this,
993 const QNetworkInterface &iface)
995 return multicastMembershipHelper(
this,
1004 if (socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) {
1006 QT_SOCKOPTLEN_T sizeofv =
sizeof(v);
1007 if (::getsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF, (
char *) &v, &sizeofv) == -1)
1008 return QNetworkInterface();
1009 return QNetworkInterface::interfaceFromIndex(v);
1014 QT_SOCKOPTLEN_T sizeofv =
sizeof(v);
1015 if (::getsockopt(socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (
char *) &v, &sizeofv) == -1)
1016 return QNetworkInterface();
1017 if (v.s_addr != 0 && sizeofv >= QT_SOCKOPTLEN_T(
sizeof(v))) {
1018 QHostAddress ipv4(ntohl(v.s_addr));
1019 QList<QNetworkInterface> ifaces = QNetworkInterface::allInterfaces();
1020 for (
int i = 0; i < ifaces.count(); ++i) {
1021 const QNetworkInterface &iface = ifaces.at(i);
1022 if (!(iface.flags() & QNetworkInterface::CanMulticast))
1024 QList<QNetworkAddressEntry> entries = iface.addressEntries();
1025 for (
int j = 0; j < entries.count(); ++j) {
1026 const QNetworkAddressEntry &entry = entries.at(j);
1027 if (entry.ip() == ipv4)
1032 return QNetworkInterface();
1038 if (socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) {
1039 uint v = iface.isValid() ? iface.index() : 0;
1040 return (::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF, (
char *) &v,
sizeof(v)) != -1);
1044 if (iface.isValid()) {
1045 QList<QNetworkAddressEntry> entries = iface.addressEntries();
1046 for (
int i = 0; i < entries.count(); ++i) {
1047 const QNetworkAddressEntry &entry = entries.at(i);
1048 const QHostAddress &ip = entry.ip();
1049 if (ip.protocol() == QAbstractSocket::IPv4Protocol) {
1050 v.s_addr = htonl(ip.toIPv4Address());
1051 int r = ::setsockopt(socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (
char *) &v,
sizeof(v));
1059 v.s_addr = INADDR_ANY;
1060 return (::setsockopt(socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (
char *) &v,
sizeof(v)) != -1);
1065 unsigned long nbytes = 0;
1066 unsigned long dummy = 0;
1067 DWORD sizeWritten = 0;
1068 if (::WSAIoctl(socketDescriptor, FIONREAD, &dummy,
sizeof(dummy), &nbytes,
sizeof(nbytes), &sizeWritten, 0,0) == SOCKET_ERROR) {
1078 if (nbytes == 1 && socketType == QAbstractSocket::UdpSocket) {
1082 buf.len =
sizeof(c);
1083 DWORD bytesReceived;
1084 DWORD flags = MSG_PEEK;
1085 if (::WSARecvFrom(socketDescriptor, &buf, 1, &bytesReceived, &flags, 0,0,0,0) == SOCKET_ERROR) {
1086 int err = WSAGetLastError();
1087 if (err != WSAECONNRESET && err != WSAENETRESET)
1090 return bytesReceived;
1100 qt_sockaddr storage;
1101 QT_SOCKLEN_T storageSize =
sizeof(storage);
1102 memset(&storage, 0, storageSize);
1104 bool result =
false;
1111 buf.len =
sizeof(c);
1112 DWORD available = 0;
1113 DWORD flags = MSG_PEEK;
1114 int ret = ::WSARecvFrom(socketDescriptor, &buf, 1, &available, &flags, &storage.a, &storageSize,0,0);
1115 int err = WSAGetLastError();
1116 if (ret == SOCKET_ERROR && err != WSAEMSGSIZE) {
1118 result = (err == WSAECONNRESET || err == WSAENETRESET);
1125#if defined (QNATIVESOCKETENGINE_DEBUG)
1126 qDebug(
"QNativeSocketEnginePrivate::nativeHasPendingDatagrams() == %s",
1127 result ?
"true" :
"false");
1140 char udpMessagePeekBuffer[2048];
1141 const int increments = 5;
1142 QVarLengthArray<WSABUF, 10> buf;
1144 buf.reserve(buf.size() + increments);
1145 std::fill_n(std::back_inserter(buf), increments, WSABUF{
sizeof(udpMessagePeekBuffer), udpMessagePeekBuffer});
1148 DWORD bytesRead = 0;
1149 recvResult = ::WSARecv(socketDescriptor, buf.data(), DWORD(buf.size()), &bytesRead, &flags,
nullptr,
nullptr);
1150 int err = WSAGetLastError();
1151 if (recvResult != SOCKET_ERROR) {
1152 ret = qint64(bytesRead);
1171#if defined (QNATIVESOCKETENGINE_DEBUG)
1172 qDebug(
"QNativeSocketEnginePrivate::nativePendingDatagramSize() == %lli", ret);
1179 QAbstractSocketEngine::PacketHeaderOptions options)
1182 char cbuf[WSA_CMSG_SPACE(
sizeof(
struct in6_pktinfo)) + WSA_CMSG_SPACE(
sizeof(
int))];
1189 memset(&msg, 0,
sizeof(msg));
1190 memset(&aa, 0,
sizeof(aa));
1193 buf.buf = maxLength ? data : &c;
1194 buf.len = maxLength ? maxLength : 1;
1195 msg.lpBuffers = &buf;
1196 msg.dwBufferCount = 1;
1197 msg.name =
reinterpret_cast<LPSOCKADDR>(&aa);
1198 msg.namelen =
sizeof(aa);
1199 msg.Control.buf = cbuf;
1200 msg.Control.len =
sizeof(cbuf);
1203 DWORD bytesRead = 0;
1207 ret = recvmsg(socketDescriptor, &msg, &bytesRead, 0,0);
1209 ret = ::WSARecvFrom(socketDescriptor, &buf, 1, &bytesRead, &flags, msg.name, &msg.namelen,0,0);
1210 if (ret == SOCKET_ERROR) {
1211 int err = WSAGetLastError();
1212 if (err == WSAEMSGSIZE) {
1215 ret = qint64(bytesRead) > maxLength ? maxLength : qint64(bytesRead);
1216 if (options & QNativeSocketEngine::WantDatagramSender)
1217 qt_socket_getPortAndAddress(socketDescriptor, &aa, &header->senderPort, &header->senderAddress);
1222 setError(QAbstractSocket::NetworkError, NetworkDroppedConnectionErrorString);
1225 setError(QAbstractSocket::ConnectionRefusedError, ConnectionResetErrorString);
1228 setError(QAbstractSocket::NetworkError, ReceiveDatagramErrorString);
1236 ret = qint64(bytesRead);
1237 if (options & QNativeSocketEngine::WantDatagramSender)
1238 qt_socket_getPortAndAddress(socketDescriptor, &aa, &header->senderPort, &header->senderAddress);
1241 if (ret != -1 && recvmsg && options != QAbstractSocketEngine::WantNone) {
1243 header->destinationPort = localPort;
1244 WSACMSGHDR *cmsgptr;
1245 for (cmsgptr = WSA_CMSG_FIRSTHDR(&msg); cmsgptr != NULL;
1246 cmsgptr = WSA_CMSG_NXTHDR(&msg, cmsgptr)) {
1247 if (cmsgptr->cmsg_level == IPPROTO_IPV6 && cmsgptr->cmsg_type == IPV6_PKTINFO
1248 && cmsgptr->cmsg_len >= WSA_CMSG_LEN(
sizeof(in6_pktinfo))) {
1249 in6_pktinfo *info =
reinterpret_cast<in6_pktinfo *>(WSA_CMSG_DATA(cmsgptr));
1251 header->destinationAddress.setAddress(
reinterpret_cast<quint8 *>(&info->ipi6_addr));
1252 header->ifindex = info->ipi6_ifindex;
1253 if (header->ifindex)
1254 header->destinationAddress.setScopeId(QString::number(info->ipi6_ifindex));
1256 if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_PKTINFO
1257 && cmsgptr->cmsg_len >= WSA_CMSG_LEN(
sizeof(in_pktinfo))) {
1258 in_pktinfo *info =
reinterpret_cast<in_pktinfo *>(WSA_CMSG_DATA(cmsgptr));
1260 WSANtohl(socketDescriptor, info->ipi_addr.s_addr, &addr);
1261 header->destinationAddress.setAddress(addr);
1262 header->ifindex = info->ipi_ifindex;
1265 if (cmsgptr->cmsg_len == WSA_CMSG_LEN(
sizeof(
int))
1266 && ((cmsgptr->cmsg_level == IPPROTO_IPV6 && cmsgptr->cmsg_type == IPV6_HOPLIMIT)
1267 || (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_TTL))) {
1268 header->hopLimit = *
reinterpret_cast<
int *>(WSA_CMSG_DATA(cmsgptr));
1273#if defined (QNATIVESOCKETENGINE_DEBUG)
1274 bool printSender = (ret != -1 && (options & QNativeSocketEngine::WantDatagramSender) != 0);
1275 qDebug(
"QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli",
1276 data, QtDebugUtils::toPrintable(data, ret, 16).constData(), maxLength,
1277 printSender ? header->senderAddress.toString().toLatin1().constData() :
"(unknown)",
1278 printSender ? header->senderPort : 0, ret);
1286 const QIpPacketHeader &header)
1289 char cbuf[WSA_CMSG_SPACE(
sizeof(
struct in6_pktinfo)) + WSA_CMSG_SPACE(
sizeof(
int))];
1292 WSACMSGHDR *cmsgptr = &align;
1297 memset(&msg, 0,
sizeof(msg));
1298 memset(&aa, 0,
sizeof(aa));
1299 buf.buf = len ? (
char*)data : 0;
1300 msg.lpBuffers = &buf;
1301 msg.dwBufferCount = 1;
1305 setPortAndAddress(header.destinationPort, header.destinationAddress, &aa, &msg.namelen);
1307 uint oldIfIndex = 0;
1308 bool mustSetIpv6MulticastIf =
false;
1310 if (msg.namelen ==
sizeof(aa.a6)) {
1312 if (header.hopLimit != -1) {
1313 msg.Control.len += WSA_CMSG_SPACE(
sizeof(
int));
1314 cmsgptr->cmsg_len = WSA_CMSG_LEN(
sizeof(
int));
1315 cmsgptr->cmsg_level = IPPROTO_IPV6;
1316 cmsgptr->cmsg_type = IPV6_HOPLIMIT;
1317 memcpy(WSA_CMSG_DATA(cmsgptr), &header.hopLimit,
sizeof(
int));
1318 cmsgptr =
reinterpret_cast<WSACMSGHDR *>(
reinterpret_cast<
char *>(cmsgptr)
1319 + WSA_CMSG_SPACE(
sizeof(
int)));
1321 if (!header.senderAddress.isNull()) {
1322 struct in6_pktinfo *data =
reinterpret_cast<in6_pktinfo *>(WSA_CMSG_DATA(cmsgptr));
1323 memset(data, 0,
sizeof(*data));
1324 msg.Control.len += WSA_CMSG_SPACE(
sizeof(*data));
1325 cmsgptr->cmsg_len = WSA_CMSG_LEN(
sizeof(*data));
1326 cmsgptr->cmsg_level = IPPROTO_IPV6;
1327 cmsgptr->cmsg_type = IPV6_PKTINFO;
1328 data->ipi6_ifindex = header.ifindex;
1330 Q_IPV6ADDR tmp = header.senderAddress.toIPv6Address();
1331 memcpy(&data->ipi6_addr, &tmp,
sizeof(tmp));
1332 cmsgptr =
reinterpret_cast<WSACMSGHDR *>(
reinterpret_cast<
char *>(cmsgptr)
1333 + WSA_CMSG_SPACE(
sizeof(*data)));
1334 }
else if (header.ifindex != 0) {
1340 QT_SOCKOPTLEN_T len =
sizeof(oldIfIndex);
1341 if (::getsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF,
1342 reinterpret_cast<
char *>(&oldIfIndex), &len) == -1
1343 || ::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF,
1344 reinterpret_cast<
const char *>(&header.ifindex),
sizeof(header.ifindex)) == -1) {
1345 setError(QAbstractSocket::NetworkError, SendDatagramErrorString);
1348 mustSetIpv6MulticastIf =
true;
1352 if (header.hopLimit != -1) {
1353 msg.Control.len += WSA_CMSG_SPACE(
sizeof(
int));
1354 cmsgptr->cmsg_len = WSA_CMSG_LEN(
sizeof(
int));
1355 cmsgptr->cmsg_level = IPPROTO_IP;
1356 cmsgptr->cmsg_type = IP_TTL;
1357 memcpy(WSA_CMSG_DATA(cmsgptr), &header.hopLimit,
sizeof(
int));
1358 cmsgptr =
reinterpret_cast<WSACMSGHDR *>(
reinterpret_cast<
char *>(cmsgptr)
1359 + WSA_CMSG_SPACE(
sizeof(
int)));
1361 if (header.ifindex != 0 || !header.senderAddress.isNull()) {
1362 struct in_pktinfo *data =
reinterpret_cast<in_pktinfo *>(WSA_CMSG_DATA(cmsgptr));
1363 memset(data, 0,
sizeof(*data));
1364 msg.Control.len += WSA_CMSG_SPACE(
sizeof(*data));
1365 cmsgptr->cmsg_len = WSA_CMSG_LEN(
sizeof(*data));
1366 cmsgptr->cmsg_level = IPPROTO_IP;
1367 cmsgptr->cmsg_type = IP_PKTINFO;
1368 data->ipi_ifindex = header.ifindex;
1369 WSAHtonl(socketDescriptor, header.senderAddress.toIPv4Address(), &data->ipi_addr.s_addr);
1370 cmsgptr =
reinterpret_cast<WSACMSGHDR *>(
reinterpret_cast<
char *>(cmsgptr)
1371 + WSA_CMSG_SPACE(
sizeof(*data)));
1375 if (msg.Control.len != 0)
1376 msg.Control.buf = cbuf;
1379 DWORD bytesSent = 0;
1382 ret = sendmsg(socketDescriptor, &msg, flags, &bytesSent, 0,0);
1384 ret = ::WSASendTo(socketDescriptor, &buf, 1, &bytesSent, flags, msg.name, msg.namelen, 0,0);
1386 if (ret == SOCKET_ERROR) {
1387 int err = WSAGetLastError();
1391 setError(QAbstractSocket::DatagramTooLargeError, DatagramTooLargeErrorString);
1394 setError(QAbstractSocket::NetworkError, SendDatagramErrorString);
1399 ret = qint64(bytesSent);
1402 if (mustSetIpv6MulticastIf) {
1404 ::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF,
1405 reinterpret_cast<
char *>(&oldIfIndex),
sizeof(oldIfIndex));
1408#if defined (QNATIVESOCKETENGINE_DEBUG)
1409 qDebug(
"QNativeSocketEnginePrivate::nativeSendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli",
1410 data, QtDebugUtils::toPrintable(data, len, 16).constData(), len,
1411 header.destinationAddress.toString().toLatin1().constData(),
1412 header.destinationPort, ret);
1421 Q_Q(QNativeSocketEngine);
1423 qint64 bytesToSend = len;
1427 buf.buf =
const_cast<
char*>(data) + ret;
1428 buf.len = bytesToSend;
1430 DWORD bytesWritten = 0;
1432 int socketRet = ::WSASend(socketDescriptor, &buf, 1, &bytesWritten, flags, 0,0);
1434 ret += qint64(bytesWritten);
1437 if (socketRet != SOCKET_ERROR) {
1438 if (ret == len || bytesToSend != qint64(bytesWritten))
1440 }
else if ((err = WSAGetLastError()) == WSAEWOULDBLOCK) {
1442 }
else if (err == WSAENOBUFS) {
1452 case WSAECONNABORTED:
1454 setError(QAbstractSocket::NetworkError, WriteErrorString);
1464 bytesToSend = qMin<qint64>(49152, len - ret);
1467#if defined (QNATIVESOCKETENGINE_DEBUG)
1468 qDebug(
"QNativeSocketEnginePrivate::nativeWrite(%p \"%s\", %lli) == %lli",
1469 data, QtDebugUtils::toPrintable(data, ret, 16).constData(), len, ret);
1480 buf.len = maxLength;
1482 DWORD bytesRead = 0;
1483 if (::WSARecv(socketDescriptor, &buf, 1, &bytesRead, &flags, 0,0) == SOCKET_ERROR) {
1484 int err = WSAGetLastError();
1487 case WSAEWOULDBLOCK:
1495 case WSAECONNABORTED:
1503 if (WSAGetLastError() == WSAEWOULDBLOCK)
1506 ret = qint64(bytesRead);
1509#if defined (QNATIVESOCKETENGINE_DEBUG)
1511 qDebug(
"QNativeSocketEnginePrivate::nativeRead(%p \"%s\", %lli) == %lli", data,
1512 QtDebugUtils::toPrintable(data, bytesRead, 16).constData(), maxLength, ret);
1514 qDebug(
"QNativeSocketEnginePrivate::nativeRead(%p, %lli) == -2 (WOULD BLOCK)",
1524 using namespace std::chrono;
1525 const auto secs = duration_cast<seconds>(dur);
1526 const auto frac = duration_cast<microseconds>(dur - secs);
1527 struct timeval tval;
1528 tval.tv_sec = secs.count();
1529 tval.tv_usec = frac.count();
1543 memset(&fds, 0,
sizeof(fd_set));
1545 fds.fd_array[0] = (SOCKET)socketDescriptor;
1547 struct timeval tv = durationToTimeval(deadline.remainingTimeAsDuration());
1549 if (selectForRead) {
1550 ret = select(0, &fds, 0, 0, &tv);
1556 FD_ZERO(&fdexception);
1557 FD_SET((SOCKET)socketDescriptor, &fdexception);
1559 ret = select(0, 0, &fds, &fdexception, &tv);
1562 if (ret > 0 && FD_ISSET((SOCKET)socketDescriptor, &fdexception))
1573 bool checkRead,
bool checkWrite,
1574 bool *selectForRead,
bool *selectForWrite)
const
1586 memset(&fdread, 0,
sizeof(fd_set));
1588 fdread.fd_count = 1;
1589 fdread.fd_array[0] = (SOCKET)socketDescriptor;
1591 memset(&fdwrite, 0,
sizeof(fd_set));
1592 FD_ZERO(&fdexception);
1594 fdwrite.fd_count = 1;
1595 fdwrite.fd_array[0] = (SOCKET)socketDescriptor;
1598 FD_SET((SOCKET)socketDescriptor, &fdexception);
1601 struct timeval tv = durationToTimeval(deadline.remainingTimeAsDuration());
1603 ret = select(socketDescriptor + 1, &fdread, &fdwrite, &fdexception, &tv);
1606 if (ret > 0 && FD_ISSET((SOCKET)socketDescriptor, &fdexception))
1615 *selectForRead = FD_ISSET((SOCKET)socketDescriptor, &fdread);
1616 *selectForWrite = FD_ISSET((SOCKET)socketDescriptor, &fdwrite);
1623#if defined (QTCPSOCKETENGINE_DEBUG)
1624 qDebug(
"QNativeSocketEnginePrivate::nativeClose()");
1630 ::closesocket(socketDescriptor);
bool nativeHasPendingDatagrams() const
bool createNewSocket(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol &protocol)
QNetworkInterface nativeMulticastInterface() const
qint64 nativeBytesAvailable() const
QSocketNotifier * readNotifier
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)
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)
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)
#define SO_EXCLUSIVEADDRUSE
static void qt_socket_getPortAndAddress(SOCKET socketDescriptor, const qt_sockaddr *sa, quint16 *port, QHostAddress *address)
static void convertToLevelAndOption(QNativeSocketEngine::SocketOption opt, QAbstractSocket::NetworkLayerProtocol socketProtocol, int &level, int &n)
static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d, int how6, int how4, const QHostAddress &groupAddress, const QNetworkInterface &iface)
#define SIO_UDP_CONNRESET
static void setErrorFromWSAError(int error, QNativeSocketEnginePrivate *d)
#define WSA_FLAG_NO_HANDLE_INHERIT
timeval durationToTimeval(std::chrono::nanoseconds dur) noexcept
#define WS_ERROR_DEBUG(x)
static QAbstractSocket::SocketType qt_socket_getType(qintptr socketDescriptor)