22#if defined(QNATIVESOCKETENGINE_DEBUG)
23#include <private/qdebug_p.h>
37#if defined(QNATIVESOCKETENGINE_DEBUG)
39void verboseWSErrorDebug(
int r)
42 case WSANOTINITIALISED :
qDebug(
"WSA error : WSANOTINITIALISED");
break;
43 case WSAEINTR:
qDebug(
"WSA error : WSAEINTR");
break;
44 case WSAEBADF:
qDebug(
"WSA error : WSAEBADF");
break;
45 case WSAEACCES:
qDebug(
"WSA error : WSAEACCES");
break;
46 case WSAEFAULT:
qDebug(
"WSA error : WSAEFAULT");
break;
47 case WSAEINVAL:
qDebug(
"WSA error : WSAEINVAL");
break;
48 case WSAEMFILE:
qDebug(
"WSA error : WSAEMFILE");
break;
49 case WSAEWOULDBLOCK:
qDebug(
"WSA error : WSAEWOULDBLOCK");
break;
50 case WSAEINPROGRESS:
qDebug(
"WSA error : WSAEINPROGRESS");
break;
51 case WSAEALREADY:
qDebug(
"WSA error : WSAEALREADY");
break;
52 case WSAENOTSOCK:
qDebug(
"WSA error : WSAENOTSOCK");
break;
53 case WSAEDESTADDRREQ:
qDebug(
"WSA error : WSAEDESTADDRREQ");
break;
54 case WSAEMSGSIZE:
qDebug(
"WSA error : WSAEMSGSIZE");
break;
55 case WSAEPROTOTYPE:
qDebug(
"WSA error : WSAEPROTOTYPE");
break;
56 case WSAENOPROTOOPT:
qDebug(
"WSA error : WSAENOPROTOOPT");
break;
57 case WSAEPROTONOSUPPORT:
qDebug(
"WSA error : WSAEPROTONOSUPPORT");
break;
58 case WSAESOCKTNOSUPPORT:
qDebug(
"WSA error : WSAESOCKTNOSUPPORT");
break;
59 case WSAEOPNOTSUPP:
qDebug(
"WSA error : WSAEOPNOTSUPP");
break;
60 case WSAEPFNOSUPPORT:
qDebug(
"WSA error : WSAEPFNOSUPPORT");
break;
61 case WSAEAFNOSUPPORT:
qDebug(
"WSA error : WSAEAFNOSUPPORT");
break;
62 case WSAEADDRINUSE:
qDebug(
"WSA error : WSAEADDRINUSE");
break;
63 case WSAEADDRNOTAVAIL:
qDebug(
"WSA error : WSAEADDRNOTAVAIL");
break;
64 case WSAENETDOWN:
qDebug(
"WSA error : WSAENETDOWN");
break;
65 case WSAENETUNREACH:
qDebug(
"WSA error : WSAENETUNREACH");
break;
66 case WSAENETRESET:
qDebug(
"WSA error : WSAENETRESET");
break;
67 case WSAECONNABORTED:
qDebug(
"WSA error : WSAECONNABORTED");
break;
68 case WSAECONNRESET:
qDebug(
"WSA error : WSAECONNRESET");
break;
69 case WSAENOBUFS:
qDebug(
"WSA error : WSAENOBUFS");
break;
70 case WSAEISCONN:
qDebug(
"WSA error : WSAEISCONN");
break;
71 case WSAENOTCONN:
qDebug(
"WSA error : WSAENOTCONN");
break;
72 case WSAESHUTDOWN:
qDebug(
"WSA error : WSAESHUTDOWN");
break;
73 case WSAETOOMANYREFS:
qDebug(
"WSA error : WSAETOOMANYREFS");
break;
74 case WSAETIMEDOUT:
qDebug(
"WSA error : WSAETIMEDOUT");
break;
75 case WSAECONNREFUSED:
qDebug(
"WSA error : WSAECONNREFUSED");
break;
76 case WSAELOOP:
qDebug(
"WSA error : WSAELOOP");
break;
77 case WSAENAMETOOLONG:
qDebug(
"WSA error : WSAENAMETOOLONG");
break;
78 case WSAEHOSTDOWN:
qDebug(
"WSA error : WSAEHOSTDOWN");
break;
79 case WSAEHOSTUNREACH:
qDebug(
"WSA error : WSAEHOSTUNREACH");
break;
80 case WSAENOTEMPTY:
qDebug(
"WSA error : WSAENOTEMPTY");
break;
81 case WSAEPROCLIM:
qDebug(
"WSA error : WSAEPROCLIM");
break;
82 case WSAEUSERS:
qDebug(
"WSA error : WSAEUSERS");
break;
83 case WSAEDQUOT:
qDebug(
"WSA error : WSAEDQUOT");
break;
84 case WSAESTALE:
qDebug(
"WSA error : WSAESTALE");
break;
85 case WSAEREMOTE:
qDebug(
"WSA error : WSAEREMOTE");
break;
86 case WSAEDISCON:
qDebug(
"WSA error : WSAEDISCON");
break;
87 default:
qDebug(
"WSA error : Unknown");
break;
92#define WS_ERROR_DEBUG(x) verboseWSErrorDebug(x)
96#define WS_ERROR_DEBUG(x) Q_UNUSED(x)
104#ifndef SO_EXCLUSIVEADDRUSE
105#define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR))
115 const sockaddr_in6 *sa6 = &sa->a6;
117 for (
int i = 0;
i < 16; ++
i)
118 tmp.c[
i] = sa6->sin6_addr.s6_addr[
i];
122 if (sa6->sin6_scope_id)
127 WSANtohs(socketDescriptor, sa6->sin6_port,
port);
130 if (sa->a.sa_family == AF_INET) {
131 const sockaddr_in *sa4 = &sa->a4;
133 WSANtohl(socketDescriptor, sa4->sin_addr.s_addr, &
addr);
139 WSANtohs(socketDescriptor, sa4->sin_port,
port);
182 level = IPPROTO_IPV6;
183 n = IPV6_MULTICAST_HOPS;
187 n = IP_MULTICAST_TTL;
192 level = IPPROTO_IPV6;
193 n = IPV6_MULTICAST_LOOP;
197 n = IP_MULTICAST_LOOP;
202 level = IPPROTO_IPV6;
211 level = IPPROTO_IPV6;
230 QT_SOCKLEN_T valueSize =
sizeof(
value);
231 if (::getsockopt(socketDescriptor, SOL_SOCKET, SO_TYPE,
232 reinterpret_cast<char *
>(&
value), &valueSize) != 0) {
235 if (
value == SOCK_STREAM)
237 else if (
value == SOCK_DGRAM)
248#ifndef SIO_UDP_CONNRESET
250# define IOC_VENDOR 0x18000000
253# define _WSAIOW(x,y) (IOC_IN|(x)|(y))
255# define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)
276#ifndef WSA_FLAG_NO_HANDLE_INHERIT
277#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
281 if (
socket == INVALID_SOCKET) {
282 int err = WSAGetLastError();
285 case WSANOTINITIALISED:
288 case WSAEAFNOSUPPORT:
289 case WSAESOCKTNOSUPPORT:
308 DWORD dwBytesReturned = 0;
309 int bNewBehavior = 1;
311 NULL, 0, &dwBytesReturned, NULL, NULL) == SOCKET_ERROR) {
313 int err = WSAGetLastError();
320 GUID recvmsgguid = WSAID_WSARECVMSG;
321 if (WSAIoctl(
socket, SIO_GET_EXTENSION_FUNCTION_POINTER,
322 &recvmsgguid,
sizeof(recvmsgguid),
323 &recvmsg,
sizeof(recvmsg), &bytesReturned, NULL, NULL) == SOCKET_ERROR)
326 GUID sendmsgguid = WSAID_WSASENDMSG;
327 if (WSAIoctl(
socket, SIO_GET_EXTENSION_FUNCTION_POINTER,
328 &sendmsgguid,
sizeof(sendmsgguid),
329 &sendmsg,
sizeof(sendmsg), &bytesReturned, NULL, NULL) == SOCKET_ERROR)
359 unsigned long buf = 0;
374#if Q_BYTE_ORDER != Q_LITTLE_ENDIAN
375#error code assumes windows is little endian
407 unsigned long buf =
v;
408 unsigned long outBuf;
409 DWORD sizeWritten = 0;
410 if (::WSAIoctl(
socketDescriptor, FIONBIO, &
buf,
sizeof(
unsigned long), &outBuf,
sizeof(
unsigned long), &sizeWritten, 0,0) == SOCKET_ERROR) {
451 QT_SOCKLEN_T sockAddrSize =
sizeof(sa);
454 memset(&sa, 0,
sizeof(sa));
458 switch (sa.a.sa_family) {
470 int err = WSAGetLastError();
472 if (err == WSAENOTSOCK) {
494 const uchar ipv6MappedNet[] = {0,0,0,0, 0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
498 if (
ok && localIPv4 == INADDR_ANY) {
504 memset(&sa, 0,
sizeof(sa));
514#if defined (QNATIVESOCKETENGINE_DEBUG)
523 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());
537 case WSAEHOSTUNREACH:
541 case WSAEADDRNOTAVAIL:
552 case WSAECONNREFUSED:
580#if defined (QNATIVESOCKETENGINE_DEBUG)
581 qDebug(
"QNativeSocketEnginePrivate::nativeConnect() to %s :: %i",
address.toString().toLatin1().constData(),
port);
585 QT_SOCKLEN_T sockAddrSize = 0;
596 int connectResult = ::WSAConnect(
socketDescriptor, &aa.a, sockAddrSize, 0,0,0,0);
597 if (connectResult == SOCKET_ERROR) {
598 int err = WSAGetLastError();
602 case WSANOTINITIALISED:
605 case WSAEWOULDBLOCK: {
612 QT_SOCKLEN_T valueSize =
sizeof(
value);
613 bool tryAgain =
false;
614 bool errorDetected =
false;
618 if (
value != NOERROR) {
620 errorDetected =
true;
623 const int val = NO_ERROR;
630 tryAgain = !tryAgain;
635 }
while (tryAgain && (tries < 2));
640 err = WSAEINPROGRESS;
649#if defined (QNATIVESOCKETENGINE_DEBUG)
650 qDebug(
"QNativeSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)",
661#if defined (QNATIVESOCKETENGINE_DEBUG)
662 qDebug(
"QNativeSocketEnginePrivate::nativeConnect(%s, %i) == true",
675 if ((
address.toIPv4Address() & 0xffff0000) == 0xefff0000) {
682 QT_SOCKLEN_T sockAddrSize = 0;
695 if (bindResult == SOCKET_ERROR && WSAGetLastError() == WSAEAFNOSUPPORT
698 aa.a4.sin_family = AF_INET;
699 aa.a4.sin_port = htons(
port);
700 aa.a4.sin_addr.s_addr = htonl(
address.toIPv4Address());
701 sockAddrSize =
sizeof(aa.a4);
704 if (bindResult == SOCKET_ERROR) {
705 int err = WSAGetLastError();
708 case WSANOTINITIALISED:
718 case WSAEADDRNOTAVAIL:
725#if defined (QNATIVESOCKETENGINE_DEBUG)
726 qDebug(
"QNativeSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
733#if defined (QNATIVESOCKETENGINE_DEBUG)
734 qDebug(
"QNativeSocketEnginePrivate::nativeBind(%s, %i) == true",
745 int err = WSAGetLastError();
748 case WSANOTINITIALISED:
759#if defined (QNATIVESOCKETENGINE_DEBUG)
760 qDebug(
"QNativeSocketEnginePrivate::nativeListen(%i) == false (%s)",
766#if defined (QNATIVESOCKETENGINE_DEBUG)
767 qDebug(
"QNativeSocketEnginePrivate::nativeListen(%i) == true", backlog);
777 if (acceptedDescriptor == INVALID_SOCKET) {
778 int err = WSAGetLastError();
783 case WSAECONNREFUSED:
820#if defined (QNATIVESOCKETENGINE_DEBUG)
821 qDebug(
"QNativeSocketEnginePrivate::nativeAccept() == %lld",
qint64(acceptedDescriptor));
823 return qintptr(acceptedDescriptor);
837 struct ip_mreq mreq4;
838 struct ipv6_mreq mreq6;
841 level = IPPROTO_IPV6;
843 sockArg =
reinterpret_cast<char *
>(&mreq6);
844 sockArgSize =
sizeof(mreq6);
845 memset(&mreq6, 0,
sizeof(mreq6));
846 Q_IPV6ADDR ip6 = groupAddress.toIPv6Address();
847 memcpy(&mreq6.ipv6mr_multiaddr, &ip6,
sizeof(ip6));
848 mreq6.ipv6mr_interface = iface.index();
852 sockArg =
reinterpret_cast<char *
>(&mreq4);
853 sockArgSize =
sizeof(mreq4);
854 memset(&mreq4, 0,
sizeof(mreq4));
855 mreq4.imr_multiaddr.s_addr = htonl(groupAddress.toIPv4Address());
857 if (iface.isValid()) {
858 const QList<QNetworkAddressEntry> addressEntries = iface.addressEntries();
874 mreq4.imr_interface.s_addr = INADDR_ANY;
883 int res = setsockopt(
d->socketDescriptor,
level, sockOpt, sockArg, sockArgSize);
917 if (::getsockopt(
socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF, (
char *) &
v, &sizeofv) == -1)
925 if (::getsockopt(
socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (
char *) &
v, &sizeofv) == -1)
930 for (
int i = 0;
i < ifaces.count(); ++
i) {
934 QList<QNetworkAddressEntry> entries =
iface.addressEntries();
935 for (
int j = 0;
j < entries.count(); ++
j) {
937 if (
entry.ip() == ipv4)
950 return (::setsockopt(
socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF, (
char *) &
v,
sizeof(
v)) != -1);
954 if (
iface.isValid()) {
955 QList<QNetworkAddressEntry> entries =
iface.addressEntries();
956 for (
int i = 0;
i < entries.count(); ++
i) {
961 int r = ::setsockopt(
socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (
char *) &
v,
sizeof(
v));
969 v.s_addr = INADDR_ANY;
970 return (::setsockopt(
socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (
char *) &
v,
sizeof(
v)) != -1);
975 unsigned long nbytes = 0;
976 unsigned long dummy = 0;
977 DWORD sizeWritten = 0;
978 if (::WSAIoctl(
socketDescriptor, FIONREAD, &dummy,
sizeof(dummy), &nbytes,
sizeof(nbytes), &sizeWritten, 0,0) == SOCKET_ERROR) {
994 DWORD
flags = MSG_PEEK;
996 int err = WSAGetLastError();
997 if (err != WSAECONNRESET && err != WSAENETRESET)
1000 return bytesReceived;
1011 QT_SOCKLEN_T storageSize =
sizeof(
storage);
1012 memset(&
storage, 0, storageSize);
1021 buf.len =
sizeof(
c);
1022 DWORD available = 0;
1023 DWORD
flags = MSG_PEEK;
1025 int err = WSAGetLastError();
1026 if (
ret == SOCKET_ERROR && err != WSAEMSGSIZE) {
1028 result = (err == WSAECONNRESET || err == WSAENETRESET);
1035#if defined (QNATIVESOCKETENGINE_DEBUG)
1036 qDebug(
"QNativeSocketEnginePrivate::nativeHasPendingDatagrams() == %s",
1037 result ?
"true" :
"false");
1050 char udpMessagePeekBuffer[2048];
1051 const int increments = 5;
1052 QVarLengthArray<WSABUF, 10>
buf;
1054 buf.reserve(
buf.size() + increments);
1055 std::fill_n(std::back_inserter(
buf), increments, WSABUF{
sizeof(udpMessagePeekBuffer), udpMessagePeekBuffer});
1058 DWORD bytesRead = 0;
1060 int err = WSAGetLastError();
1061 if (recvResult != SOCKET_ERROR) {
1081#if defined (QNATIVESOCKETENGINE_DEBUG)
1082 qDebug(
"QNativeSocketEnginePrivate::nativePendingDatagramSize() == %lli",
ret);
1089 QAbstractSocketEngine::PacketHeaderOptions options)
1092 char cbuf[WSA_CMSG_SPACE(
sizeof(
struct in6_pktinfo)) + WSA_CMSG_SPACE(
sizeof(
int))];
1099 memset(&msg, 0,
sizeof(msg));
1100 memset(&aa, 0,
sizeof(aa));
1105 msg.lpBuffers = &
buf;
1106 msg.dwBufferCount = 1;
1107 msg.name =
reinterpret_cast<LPSOCKADDR
>(&aa);
1108 msg.namelen =
sizeof(aa);
1109 msg.Control.buf = cbuf;
1110 msg.Control.len =
sizeof(cbuf);
1113 DWORD bytesRead = 0;
1120 if (
ret == SOCKET_ERROR) {
1121 int err = WSAGetLastError();
1122 if (err == WSAEMSGSIZE) {
1154 WSACMSGHDR *cmsgptr;
1155 for (cmsgptr = WSA_CMSG_FIRSTHDR(&msg); cmsgptr != NULL;
1156 cmsgptr = WSA_CMSG_NXTHDR(&msg, cmsgptr)) {
1157 if (cmsgptr->cmsg_level == IPPROTO_IPV6 && cmsgptr->cmsg_type == IPV6_PKTINFO
1158 && cmsgptr->cmsg_len >= WSA_CMSG_LEN(
sizeof(in6_pktinfo))) {
1159 in6_pktinfo *
info =
reinterpret_cast<in6_pktinfo *
>(WSA_CMSG_DATA(cmsgptr));
1161 header->destinationAddress.setAddress(
reinterpret_cast<quint8 *
>(&
info->ipi6_addr));
1166 if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_PKTINFO
1167 && cmsgptr->cmsg_len >= WSA_CMSG_LEN(
sizeof(in_pktinfo))) {
1168 in_pktinfo *
info =
reinterpret_cast<in_pktinfo *
>(WSA_CMSG_DATA(cmsgptr));
1175 if (cmsgptr->cmsg_len == WSA_CMSG_LEN(
sizeof(
int))
1176 && ((cmsgptr->cmsg_level == IPPROTO_IPV6 && cmsgptr->cmsg_type == IPV6_HOPLIMIT)
1177 || (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_TTL))) {
1178 header->hopLimit = *
reinterpret_cast<int *
>(WSA_CMSG_DATA(cmsgptr));
1183#if defined (QNATIVESOCKETENGINE_DEBUG)
1185 qDebug(
"QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli",
1187 printSender ?
header->senderAddress.toString().toLatin1().constData() :
"(unknown)",
1188 printSender ?
header->senderPort : 0,
ret);
1199 char cbuf[WSA_CMSG_SPACE(
sizeof(
struct in6_pktinfo)) + WSA_CMSG_SPACE(
sizeof(
int))];
1202 WSACMSGHDR *cmsgptr = &align;
1207 memset(&msg, 0,
sizeof(msg));
1208 memset(&aa, 0,
sizeof(aa));
1210 msg.lpBuffers = &
buf;
1211 msg.dwBufferCount = 1;
1217 uint oldIfIndex = 0;
1218 bool mustSetIpv6MulticastIf =
false;
1220 if (msg.namelen ==
sizeof(aa.a6)) {
1222 if (
header.hopLimit != -1) {
1223 msg.Control.len += WSA_CMSG_SPACE(
sizeof(
int));
1224 cmsgptr->cmsg_len = WSA_CMSG_LEN(
sizeof(
int));
1225 cmsgptr->cmsg_level = IPPROTO_IPV6;
1226 cmsgptr->cmsg_type = IPV6_HOPLIMIT;
1227 memcpy(WSA_CMSG_DATA(cmsgptr), &
header.hopLimit,
sizeof(
int));
1228 cmsgptr =
reinterpret_cast<WSACMSGHDR *
>(
reinterpret_cast<char *
>(cmsgptr)
1229 + WSA_CMSG_SPACE(
sizeof(
int)));
1231 if (!
header.senderAddress.isNull()) {
1232 struct in6_pktinfo *
data =
reinterpret_cast<in6_pktinfo *
>(WSA_CMSG_DATA(cmsgptr));
1234 msg.Control.len += WSA_CMSG_SPACE(
sizeof(*
data));
1235 cmsgptr->cmsg_len = WSA_CMSG_LEN(
sizeof(*
data));
1236 cmsgptr->cmsg_level = IPPROTO_IPV6;
1237 cmsgptr->cmsg_type = IPV6_PKTINFO;
1241 memcpy(&
data->ipi6_addr, &tmp,
sizeof(tmp));
1242 cmsgptr =
reinterpret_cast<WSACMSGHDR *
>(
reinterpret_cast<char *
>(cmsgptr)
1243 + WSA_CMSG_SPACE(
sizeof(*
data)));
1244 }
else if (
header.ifindex != 0) {
1252 reinterpret_cast<char *
>(&oldIfIndex), &
len) == -1
1254 reinterpret_cast<const char *
>(&
header.ifindex),
sizeof(
header.ifindex)) == -1) {
1258 mustSetIpv6MulticastIf =
true;
1262 if (
header.hopLimit != -1) {
1263 msg.Control.len += WSA_CMSG_SPACE(
sizeof(
int));
1264 cmsgptr->cmsg_len = WSA_CMSG_LEN(
sizeof(
int));
1265 cmsgptr->cmsg_level = IPPROTO_IP;
1266 cmsgptr->cmsg_type = IP_TTL;
1267 memcpy(WSA_CMSG_DATA(cmsgptr), &
header.hopLimit,
sizeof(
int));
1268 cmsgptr =
reinterpret_cast<WSACMSGHDR *
>(
reinterpret_cast<char *
>(cmsgptr)
1269 + WSA_CMSG_SPACE(
sizeof(
int)));
1271 if (
header.ifindex != 0 || !
header.senderAddress.isNull()) {
1272 struct in_pktinfo *
data =
reinterpret_cast<in_pktinfo *
>(WSA_CMSG_DATA(cmsgptr));
1274 msg.Control.len += WSA_CMSG_SPACE(
sizeof(*
data));
1275 cmsgptr->cmsg_len = WSA_CMSG_LEN(
sizeof(*
data));
1276 cmsgptr->cmsg_level = IPPROTO_IP;
1277 cmsgptr->cmsg_type = IP_PKTINFO;
1280 cmsgptr =
reinterpret_cast<WSACMSGHDR *
>(
reinterpret_cast<char *
>(cmsgptr)
1281 + WSA_CMSG_SPACE(
sizeof(*
data)));
1285 if (msg.Control.len != 0)
1286 msg.Control.buf = cbuf;
1289 DWORD bytesSent = 0;
1296 if (
ret == SOCKET_ERROR) {
1297 int err = WSAGetLastError();
1312 if (mustSetIpv6MulticastIf) {
1315 reinterpret_cast<char *
>(&oldIfIndex),
sizeof(oldIfIndex));
1318#if defined (QNATIVESOCKETENGINE_DEBUG)
1319 qDebug(
"QNativeSocketEnginePrivate::nativeSendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli",
1321 header.destinationAddress.toString().toLatin1().constData(),
1338 buf.len = bytesToSend;
1347 if (socketRet != SOCKET_ERROR) {
1350 }
else if ((err = WSAGetLastError()) == WSAEWOULDBLOCK) {
1352 }
else if (err == WSAENOBUFS) {
1362 case WSAECONNABORTED:
1374 bytesToSend = qMin<qint64>(49152,
len -
ret);
1377#if defined (QNATIVESOCKETENGINE_DEBUG)
1378 qDebug(
"QNativeSocketEnginePrivate::nativeWrite(%p \"%s\", %lli) == %lli",
1392 DWORD bytesRead = 0;
1394 int err = WSAGetLastError();
1397 case WSAEWOULDBLOCK:
1405 case WSAECONNABORTED:
1413 if (WSAGetLastError() == WSAEWOULDBLOCK)
1419#if defined (QNATIVESOCKETENGINE_DEBUG)
1421 qDebug(
"QNativeSocketEnginePrivate::nativeRead(%p \"%s\", %lli) == %lli",
data,
1424 qDebug(
"QNativeSocketEnginePrivate::nativeRead(%p, %lli) == -2 (WOULD BLOCK)",
1434 using namespace std::chrono;
1435 const auto secs = duration_cast<seconds>(dur);
1436 const auto frac = duration_cast<microseconds>(dur - secs);
1437 struct timeval tval;
1438 tval.tv_sec = secs.count();
1439 tval.tv_usec = frac.count();
1453 memset(&
fds, 0,
sizeof(fd_set));
1459 if (selectForRead) {
1466 FD_ZERO(&fdexception);
1483 bool checkRead,
bool checkWrite,
1484 bool *selectForRead,
bool *selectForWrite)
const
1496 memset(&fdread, 0,
sizeof(fd_set));
1498 fdread.fd_count = 1;
1501 memset(&fdwrite, 0,
sizeof(fd_set));
1502 FD_ZERO(&fdexception);
1504 fdwrite.fd_count = 1;
1533#if defined (QTCPSOCKETENGINE_DEBUG)
1534 qDebug(
"QNativeSocketEnginePrivate::nativeClose()");
static QAbstractEventDispatcher * instance(QThread *thread=nullptr)
Returns a pointer to the event dispatcher object for the specified thread.
QAbstractSocket::NetworkLayerProtocol socketProtocol
QHostAddress localAddress
QAbstractSocket::SocketState socketState
QString socketErrorString
QAbstractSocket::SocketType socketType
@ 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.
std::chrono::nanoseconds remainingTimeAsDuration() const noexcept
Returns the time remaining before the deadline.
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.
bool isInSubnet(const QHostAddress &subnet, int netmask) const
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
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)
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
@ NetworkDroppedConnectionErrorString
@ ConnectionResetErrorString
@ ReceiveDatagramErrorString
@ AddressNotAvailableErrorString
@ NonBlockingInitFailedErrorString
@ 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 QList< QNetworkInterface > allInterfaces()
Returns a listing of all the network interfaces found on the host machine.
bool isEnabled() const
Returns true if the notifier is enabled; otherwise returns false.
void setEnabled(bool)
If enable is true, the notifier is enabled; otherwise the notifier is disabled.
\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...
EGLint EGLint EGLint EGLint int int int int * fds
void qErrnoWarning(const char *msg,...)
Combined button and popup list for selecting options.
Q_CORE_EXPORT QByteArray toPrintable(const char *data, qint64 len, qsizetype maxSize)
constexpr QBindableInterface iface
DBusConnection const char DBusError * error
static QString header(const QString &name)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static QT_BEGIN_NAMESPACE const char * socketType(QSocketNotifier::Type type)
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)
#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)
GLenum GLsizei GLuint GLint * bytesWritten
GLsizei const GLfloat * v
[13]
GLenum GLuint GLint level
GLboolean GLboolean GLboolean GLboolean a
[7]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLenum GLsizei const GLchar * buf
GLuint GLuint64EXT address
GLdouble GLdouble GLdouble GLdouble q
#define QStringLiteral(str)
QDeadlineTimer deadline(30s)
selection select(topLeft, bottomRight)
socketLayer bind(QHostAddress::Any, 4000)