21#if defined(QNATIVESOCKETENGINE_DEBUG)
22#include <private/qdebug_p.h>
36#if defined(QNATIVESOCKETENGINE_DEBUG)
38void verboseWSErrorDebug(
int r)
41 case WSANOTINITIALISED :
qDebug(
"WSA error : WSANOTINITIALISED");
break;
42 case WSAEINTR:
qDebug(
"WSA error : WSAEINTR");
break;
43 case WSAEBADF:
qDebug(
"WSA error : WSAEBADF");
break;
44 case WSAEACCES:
qDebug(
"WSA error : WSAEACCES");
break;
45 case WSAEFAULT:
qDebug(
"WSA error : WSAEFAULT");
break;
46 case WSAEINVAL:
qDebug(
"WSA error : WSAEINVAL");
break;
47 case WSAEMFILE:
qDebug(
"WSA error : WSAEMFILE");
break;
48 case WSAEWOULDBLOCK:
qDebug(
"WSA error : WSAEWOULDBLOCK");
break;
49 case WSAEINPROGRESS:
qDebug(
"WSA error : WSAEINPROGRESS");
break;
50 case WSAEALREADY:
qDebug(
"WSA error : WSAEALREADY");
break;
51 case WSAENOTSOCK:
qDebug(
"WSA error : WSAENOTSOCK");
break;
52 case WSAEDESTADDRREQ:
qDebug(
"WSA error : WSAEDESTADDRREQ");
break;
53 case WSAEMSGSIZE:
qDebug(
"WSA error : WSAEMSGSIZE");
break;
54 case WSAEPROTOTYPE:
qDebug(
"WSA error : WSAEPROTOTYPE");
break;
55 case WSAENOPROTOOPT:
qDebug(
"WSA error : WSAENOPROTOOPT");
break;
56 case WSAEPROTONOSUPPORT:
qDebug(
"WSA error : WSAEPROTONOSUPPORT");
break;
57 case WSAESOCKTNOSUPPORT:
qDebug(
"WSA error : WSAESOCKTNOSUPPORT");
break;
58 case WSAEOPNOTSUPP:
qDebug(
"WSA error : WSAEOPNOTSUPP");
break;
59 case WSAEPFNOSUPPORT:
qDebug(
"WSA error : WSAEPFNOSUPPORT");
break;
60 case WSAEAFNOSUPPORT:
qDebug(
"WSA error : WSAEAFNOSUPPORT");
break;
61 case WSAEADDRINUSE:
qDebug(
"WSA error : WSAEADDRINUSE");
break;
62 case WSAEADDRNOTAVAIL:
qDebug(
"WSA error : WSAEADDRNOTAVAIL");
break;
63 case WSAENETDOWN:
qDebug(
"WSA error : WSAENETDOWN");
break;
64 case WSAENETUNREACH:
qDebug(
"WSA error : WSAENETUNREACH");
break;
65 case WSAENETRESET:
qDebug(
"WSA error : WSAENETRESET");
break;
66 case WSAECONNABORTED:
qDebug(
"WSA error : WSAECONNABORTED");
break;
67 case WSAECONNRESET:
qDebug(
"WSA error : WSAECONNRESET");
break;
68 case WSAENOBUFS:
qDebug(
"WSA error : WSAENOBUFS");
break;
69 case WSAEISCONN:
qDebug(
"WSA error : WSAEISCONN");
break;
70 case WSAENOTCONN:
qDebug(
"WSA error : WSAENOTCONN");
break;
71 case WSAESHUTDOWN:
qDebug(
"WSA error : WSAESHUTDOWN");
break;
72 case WSAETOOMANYREFS:
qDebug(
"WSA error : WSAETOOMANYREFS");
break;
73 case WSAETIMEDOUT:
qDebug(
"WSA error : WSAETIMEDOUT");
break;
74 case WSAECONNREFUSED:
qDebug(
"WSA error : WSAECONNREFUSED");
break;
75 case WSAELOOP:
qDebug(
"WSA error : WSAELOOP");
break;
76 case WSAENAMETOOLONG:
qDebug(
"WSA error : WSAENAMETOOLONG");
break;
77 case WSAEHOSTDOWN:
qDebug(
"WSA error : WSAEHOSTDOWN");
break;
78 case WSAEHOSTUNREACH:
qDebug(
"WSA error : WSAEHOSTUNREACH");
break;
79 case WSAENOTEMPTY:
qDebug(
"WSA error : WSAENOTEMPTY");
break;
80 case WSAEPROCLIM:
qDebug(
"WSA error : WSAEPROCLIM");
break;
81 case WSAEUSERS:
qDebug(
"WSA error : WSAEUSERS");
break;
82 case WSAEDQUOT:
qDebug(
"WSA error : WSAEDQUOT");
break;
83 case WSAESTALE:
qDebug(
"WSA error : WSAESTALE");
break;
84 case WSAEREMOTE:
qDebug(
"WSA error : WSAEREMOTE");
break;
85 case WSAEDISCON:
qDebug(
"WSA error : WSAEDISCON");
break;
86 default:
qDebug(
"WSA error : Unknown");
break;
91#define WS_ERROR_DEBUG(x) verboseWSErrorDebug(x)
95#define WS_ERROR_DEBUG(x) Q_UNUSED(x)
103#ifndef SO_EXCLUSIVEADDRUSE
104#define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR))
114 const sockaddr_in6 *sa6 = &sa->
a6;
116 for (
int i = 0;
i < 16; ++
i)
117 tmp.c[
i] = sa6->sin6_addr.s6_addr[
i];
121 if (sa6->sin6_scope_id)
126 WSANtohs(socketDescriptor, sa6->sin6_port,
port);
129 if (sa->
a.sa_family == AF_INET) {
130 const sockaddr_in *sa4 = &sa->
a4;
132 WSANtohl(socketDescriptor, sa4->sin_addr.s_addr, &
addr);
138 WSANtohs(socketDescriptor, sa4->sin_port,
port);
181 level = IPPROTO_IPV6;
182 n = IPV6_MULTICAST_HOPS;
186 n = IP_MULTICAST_TTL;
191 level = IPPROTO_IPV6;
192 n = IPV6_MULTICAST_LOOP;
196 n = IP_MULTICAST_LOOP;
201 level = IPPROTO_IPV6;
210 level = IPPROTO_IPV6;
229 QT_SOCKLEN_T valueSize =
sizeof(
value);
230 if (::getsockopt(socketDescriptor, SOL_SOCKET, SO_TYPE,
231 reinterpret_cast<char *
>(&
value), &valueSize) != 0) {
234 if (
value == SOCK_STREAM)
236 else if (
value == SOCK_DGRAM)
247#ifndef SIO_UDP_CONNRESET
249# define IOC_VENDOR 0x18000000
252# define _WSAIOW(x,y) (IOC_IN|(x)|(y))
254# define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)
275#ifndef WSA_FLAG_NO_HANDLE_INHERIT
276#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
280 if (
socket == INVALID_SOCKET) {
281 int err = WSAGetLastError();
284 case WSANOTINITIALISED:
287 case WSAEAFNOSUPPORT:
288 case WSAESOCKTNOSUPPORT:
307 DWORD dwBytesReturned = 0;
308 int bNewBehavior = 1;
310 NULL, 0, &dwBytesReturned, NULL, NULL) == SOCKET_ERROR) {
312 int err = WSAGetLastError();
319 GUID recvmsgguid = WSAID_WSARECVMSG;
320 if (WSAIoctl(
socket, SIO_GET_EXTENSION_FUNCTION_POINTER,
321 &recvmsgguid,
sizeof(recvmsgguid),
322 &recvmsg,
sizeof(recvmsg), &bytesReturned, NULL, NULL) == SOCKET_ERROR)
325 GUID sendmsgguid = WSAID_WSASENDMSG;
326 if (WSAIoctl(
socket, SIO_GET_EXTENSION_FUNCTION_POINTER,
327 &sendmsgguid,
sizeof(sendmsgguid),
328 &sendmsg,
sizeof(sendmsg), &bytesReturned, NULL, NULL) == SOCKET_ERROR)
358 unsigned long buf = 0;
373#if Q_BYTE_ORDER != Q_LITTLE_ENDIAN
374#error code assumes windows is little endian
406 unsigned long buf =
v;
407 unsigned long outBuf;
408 DWORD sizeWritten = 0;
409 if (::WSAIoctl(
socketDescriptor, FIONBIO, &
buf,
sizeof(
unsigned long), &outBuf,
sizeof(
unsigned long), &sizeWritten, 0,0) == SOCKET_ERROR) {
450 QT_SOCKLEN_T sockAddrSize =
sizeof(sa);
453 memset(&sa, 0,
sizeof(sa));
457 switch (sa.
a.sa_family) {
469 int err = WSAGetLastError();
471 if (err == WSAENOTSOCK) {
493 const uchar ipv6MappedNet[] = {0,0,0,0, 0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
497 if (
ok && localIPv4 == INADDR_ANY) {
503 memset(&sa, 0,
sizeof(sa));
513#if defined (QNATIVESOCKETENGINE_DEBUG)
522 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());
536 case WSAEHOSTUNREACH:
540 case WSAEADDRNOTAVAIL:
551 case WSAECONNREFUSED:
579#if defined (QNATIVESOCKETENGINE_DEBUG)
580 qDebug(
"QNativeSocketEnginePrivate::nativeConnect() to %s :: %i",
address.toString().toLatin1().constData(),
port);
584 QT_SOCKLEN_T sockAddrSize = 0;
595 int connectResult = ::WSAConnect(
socketDescriptor, &aa.
a, sockAddrSize, 0,0,0,0);
596 if (connectResult == SOCKET_ERROR) {
597 int err = WSAGetLastError();
601 case WSANOTINITIALISED:
604 case WSAEWOULDBLOCK: {
611 QT_SOCKLEN_T valueSize =
sizeof(
value);
612 bool tryAgain =
false;
613 bool errorDetected =
false;
617 if (
value != NOERROR) {
619 errorDetected =
true;
622 const int val = NO_ERROR;
629 tryAgain = !tryAgain;
634 }
while (tryAgain && (tries < 2));
639 err = WSAEINPROGRESS;
648#if defined (QNATIVESOCKETENGINE_DEBUG)
649 qDebug(
"QNativeSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)",
660#if defined (QNATIVESOCKETENGINE_DEBUG)
661 qDebug(
"QNativeSocketEnginePrivate::nativeConnect(%s, %i) == true",
674 if ((
address.toIPv4Address() & 0xffff0000) == 0xefff0000) {
681 QT_SOCKLEN_T sockAddrSize = 0;
694 if (bindResult == SOCKET_ERROR && WSAGetLastError() == WSAEAFNOSUPPORT
697 aa.
a4.sin_family = AF_INET;
698 aa.
a4.sin_port = htons(
port);
699 aa.
a4.sin_addr.s_addr = htonl(
address.toIPv4Address());
700 sockAddrSize =
sizeof(aa.
a4);
703 if (bindResult == SOCKET_ERROR) {
704 int err = WSAGetLastError();
707 case WSANOTINITIALISED:
717 case WSAEADDRNOTAVAIL:
724#if defined (QNATIVESOCKETENGINE_DEBUG)
725 qDebug(
"QNativeSocketEnginePrivate::nativeBind(%s, %i) == false (%s)",
732#if defined (QNATIVESOCKETENGINE_DEBUG)
733 qDebug(
"QNativeSocketEnginePrivate::nativeBind(%s, %i) == true",
744 int err = WSAGetLastError();
747 case WSANOTINITIALISED:
758#if defined (QNATIVESOCKETENGINE_DEBUG)
759 qDebug(
"QNativeSocketEnginePrivate::nativeListen(%i) == false (%s)",
765#if defined (QNATIVESOCKETENGINE_DEBUG)
766 qDebug(
"QNativeSocketEnginePrivate::nativeListen(%i) == true", backlog);
776 if (acceptedDescriptor == INVALID_SOCKET) {
777 int err = WSAGetLastError();
782 case WSAECONNREFUSED:
819#if defined (QNATIVESOCKETENGINE_DEBUG)
820 qDebug(
"QNativeSocketEnginePrivate::nativeAccept() == %lld",
qint64(acceptedDescriptor));
822 return qintptr(acceptedDescriptor);
836 struct ip_mreq mreq4;
837 struct ipv6_mreq mreq6;
840 level = IPPROTO_IPV6;
842 sockArg =
reinterpret_cast<char *
>(&mreq6);
843 sockArgSize =
sizeof(mreq6);
844 memset(&mreq6, 0,
sizeof(mreq6));
846 memcpy(&mreq6.ipv6mr_multiaddr, &ip6,
sizeof(ip6));
847 mreq6.ipv6mr_interface = iface.index();
851 sockArg =
reinterpret_cast<char *
>(&mreq4);
852 sockArgSize =
sizeof(mreq4);
853 memset(&mreq4, 0,
sizeof(mreq4));
854 mreq4.imr_multiaddr.s_addr = htonl(groupAddress.
toIPv4Address());
856 if (iface.isValid()) {
873 mreq4.imr_interface.s_addr = INADDR_ANY;
882 int res = setsockopt(
d->socketDescriptor,
level, sockOpt, sockArg, sockArgSize);
916 if (::getsockopt(
socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF, (
char *) &
v, &sizeofv) == -1)
924 if (::getsockopt(
socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (
char *) &
v, &sizeofv) == -1)
929 for (
int i = 0;
i < ifaces.
count(); ++
i) {
934 for (
int j = 0;
j < entries.
count(); ++
j) {
936 if (
entry.ip() == ipv4)
949 return (::setsockopt(
socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF, (
char *) &
v,
sizeof(
v)) != -1);
953 if (
iface.isValid()) {
955 for (
int i = 0;
i < entries.
count(); ++
i) {
960 int r = ::setsockopt(
socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (
char *) &
v,
sizeof(
v));
968 v.s_addr = INADDR_ANY;
969 return (::setsockopt(
socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (
char *) &
v,
sizeof(
v)) != -1);
974 unsigned long nbytes = 0;
975 unsigned long dummy = 0;
976 DWORD sizeWritten = 0;
977 if (::WSAIoctl(
socketDescriptor, FIONREAD, &dummy,
sizeof(dummy), &nbytes,
sizeof(nbytes), &sizeWritten, 0,0) == SOCKET_ERROR) {
993 DWORD
flags = MSG_PEEK;
995 int err = WSAGetLastError();
996 if (err != WSAECONNRESET && err != WSAENETRESET)
999 return bytesReceived;
1010 QT_SOCKLEN_T storageSize =
sizeof(
storage);
1011 memset(&
storage, 0, storageSize);
1020 buf.len =
sizeof(
c);
1021 DWORD available = 0;
1022 DWORD
flags = MSG_PEEK;
1024 int err = WSAGetLastError();
1025 if (
ret == SOCKET_ERROR && err != WSAEMSGSIZE) {
1027 result = (err == WSAECONNRESET || err == WSAENETRESET);
1034#if defined (QNATIVESOCKETENGINE_DEBUG)
1035 qDebug(
"QNativeSocketEnginePrivate::nativeHasPendingDatagrams() == %s",
1036 result ?
"true" :
"false");
1049 char udpMessagePeekBuffer[2048];
1050 const int increments = 5;
1053 buf.reserve(
buf.size() + increments);
1054 std::fill_n(std::back_inserter(
buf), increments, WSABUF{
sizeof(udpMessagePeekBuffer), udpMessagePeekBuffer});
1057 DWORD bytesRead = 0;
1059 int err = WSAGetLastError();
1060 if (recvResult != SOCKET_ERROR) {
1080#if defined (QNATIVESOCKETENGINE_DEBUG)
1081 qDebug(
"QNativeSocketEnginePrivate::nativePendingDatagramSize() == %lli",
ret);
1088 QAbstractSocketEngine::PacketHeaderOptions options)
1091 char cbuf[WSA_CMSG_SPACE(
sizeof(
struct in6_pktinfo)) + WSA_CMSG_SPACE(
sizeof(
int))];
1098 memset(&msg, 0,
sizeof(msg));
1099 memset(&aa, 0,
sizeof(aa));
1104 msg.lpBuffers = &
buf;
1105 msg.dwBufferCount = 1;
1106 msg.name =
reinterpret_cast<LPSOCKADDR
>(&aa);
1107 msg.namelen =
sizeof(aa);
1108 msg.Control.buf = cbuf;
1109 msg.Control.len =
sizeof(cbuf);
1112 DWORD bytesRead = 0;
1119 if (
ret == SOCKET_ERROR) {
1120 int err = WSAGetLastError();
1121 if (err == WSAEMSGSIZE) {
1153 WSACMSGHDR *cmsgptr;
1154 for (cmsgptr = WSA_CMSG_FIRSTHDR(&msg); cmsgptr != NULL;
1155 cmsgptr = WSA_CMSG_NXTHDR(&msg, cmsgptr)) {
1156 if (cmsgptr->cmsg_level == IPPROTO_IPV6 && cmsgptr->cmsg_type == IPV6_PKTINFO
1157 && cmsgptr->cmsg_len >= WSA_CMSG_LEN(
sizeof(in6_pktinfo))) {
1158 in6_pktinfo *
info =
reinterpret_cast<in6_pktinfo *
>(WSA_CMSG_DATA(cmsgptr));
1160 header->destinationAddress.setAddress(
reinterpret_cast<quint8 *
>(&
info->ipi6_addr));
1165 if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_PKTINFO
1166 && cmsgptr->cmsg_len >= WSA_CMSG_LEN(
sizeof(in_pktinfo))) {
1167 in_pktinfo *
info =
reinterpret_cast<in_pktinfo *
>(WSA_CMSG_DATA(cmsgptr));
1174 if (cmsgptr->cmsg_len == WSA_CMSG_LEN(
sizeof(
int))
1175 && ((cmsgptr->cmsg_level == IPPROTO_IPV6 && cmsgptr->cmsg_type == IPV6_HOPLIMIT)
1176 || (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_TTL))) {
1177 header->hopLimit = *
reinterpret_cast<int *
>(WSA_CMSG_DATA(cmsgptr));
1182#if defined (QNATIVESOCKETENGINE_DEBUG)
1184 qDebug(
"QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli",
1187 printSender ?
header->senderPort : 0,
ret);
1198 char cbuf[WSA_CMSG_SPACE(
sizeof(
struct in6_pktinfo)) + WSA_CMSG_SPACE(
sizeof(
int))];
1201 WSACMSGHDR *cmsgptr = &align;
1206 memset(&msg, 0,
sizeof(msg));
1207 memset(&aa, 0,
sizeof(aa));
1209 msg.lpBuffers = &
buf;
1210 msg.dwBufferCount = 1;
1216 uint oldIfIndex = 0;
1217 bool mustSetIpv6MulticastIf =
false;
1219 if (msg.namelen ==
sizeof(aa.
a6)) {
1221 if (
header.hopLimit != -1) {
1222 msg.Control.len += WSA_CMSG_SPACE(
sizeof(
int));
1223 cmsgptr->cmsg_len = WSA_CMSG_LEN(
sizeof(
int));
1224 cmsgptr->cmsg_level = IPPROTO_IPV6;
1225 cmsgptr->cmsg_type = IPV6_HOPLIMIT;
1226 memcpy(WSA_CMSG_DATA(cmsgptr), &
header.hopLimit,
sizeof(
int));
1227 cmsgptr =
reinterpret_cast<WSACMSGHDR *
>(
reinterpret_cast<char *
>(cmsgptr)
1228 + WSA_CMSG_SPACE(
sizeof(
int)));
1231 struct in6_pktinfo *
data =
reinterpret_cast<in6_pktinfo *
>(WSA_CMSG_DATA(cmsgptr));
1233 msg.Control.len += WSA_CMSG_SPACE(
sizeof(*
data));
1234 cmsgptr->cmsg_len = WSA_CMSG_LEN(
sizeof(*
data));
1235 cmsgptr->cmsg_level = IPPROTO_IPV6;
1236 cmsgptr->cmsg_type = IPV6_PKTINFO;
1240 memcpy(&
data->ipi6_addr, &tmp,
sizeof(tmp));
1241 cmsgptr =
reinterpret_cast<WSACMSGHDR *
>(
reinterpret_cast<char *
>(cmsgptr)
1242 + WSA_CMSG_SPACE(
sizeof(*
data)));
1243 }
else if (
header.ifindex != 0) {
1251 reinterpret_cast<char *
>(&oldIfIndex), &
len) == -1
1253 reinterpret_cast<const char *
>(&
header.ifindex),
sizeof(
header.ifindex)) == -1) {
1257 mustSetIpv6MulticastIf =
true;
1261 if (
header.hopLimit != -1) {
1262 msg.Control.len += WSA_CMSG_SPACE(
sizeof(
int));
1263 cmsgptr->cmsg_len = WSA_CMSG_LEN(
sizeof(
int));
1264 cmsgptr->cmsg_level = IPPROTO_IP;
1265 cmsgptr->cmsg_type = IP_TTL;
1266 memcpy(WSA_CMSG_DATA(cmsgptr), &
header.hopLimit,
sizeof(
int));
1267 cmsgptr =
reinterpret_cast<WSACMSGHDR *
>(
reinterpret_cast<char *
>(cmsgptr)
1268 + WSA_CMSG_SPACE(
sizeof(
int)));
1271 struct in_pktinfo *
data =
reinterpret_cast<in_pktinfo *
>(WSA_CMSG_DATA(cmsgptr));
1273 msg.Control.len += WSA_CMSG_SPACE(
sizeof(*
data));
1274 cmsgptr->cmsg_len = WSA_CMSG_LEN(
sizeof(*
data));
1275 cmsgptr->cmsg_level = IPPROTO_IP;
1276 cmsgptr->cmsg_type = IP_PKTINFO;
1279 cmsgptr =
reinterpret_cast<WSACMSGHDR *
>(
reinterpret_cast<char *
>(cmsgptr)
1280 + WSA_CMSG_SPACE(
sizeof(*
data)));
1284 if (msg.Control.len != 0)
1285 msg.Control.buf = cbuf;
1288 DWORD bytesSent = 0;
1295 if (
ret == SOCKET_ERROR) {
1296 int err = WSAGetLastError();
1311 if (mustSetIpv6MulticastIf) {
1314 reinterpret_cast<char *
>(&oldIfIndex),
sizeof(oldIfIndex));
1317#if defined (QNATIVESOCKETENGINE_DEBUG)
1318 qDebug(
"QNativeSocketEnginePrivate::nativeSendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli",
1337 buf.len = bytesToSend;
1346 if (socketRet != SOCKET_ERROR) {
1349 }
else if ((err = WSAGetLastError()) == WSAEWOULDBLOCK) {
1351 }
else if (err == WSAENOBUFS) {
1361 case WSAECONNABORTED:
1373 bytesToSend = qMin<qint64>(49152,
len -
ret);
1376#if defined (QNATIVESOCKETENGINE_DEBUG)
1377 qDebug(
"QNativeSocketEnginePrivate::nativeWrite(%p \"%s\", %lli) == %lli",
1391 DWORD bytesRead = 0;
1393 int err = WSAGetLastError();
1396 case WSAEWOULDBLOCK:
1404 case WSAECONNABORTED:
1412 if (WSAGetLastError() == WSAEWOULDBLOCK)
1418#if defined (QNATIVESOCKETENGINE_DEBUG)
1420 qDebug(
"QNativeSocketEnginePrivate::nativeRead(%p \"%s\", %lli) == %lli",
data,
1423 qDebug(
"QNativeSocketEnginePrivate::nativeRead(%p, %lli) == -2 (WOULD BLOCK)",
1441 memset(&
fds, 0,
sizeof(fd_set));
1447 tv.tv_usec = (
timeout % 1000) * 1000;
1449 if (selectForRead) {
1456 FD_ZERO(&fdexception);
1473 bool checkRead,
bool checkWrite,
1474 bool *selectForRead,
bool *selectForWrite)
const
1486 memset(&fdread, 0,
sizeof(fd_set));
1488 fdread.fd_count = 1;
1491 memset(&fdwrite, 0,
sizeof(fd_set));
1492 FD_ZERO(&fdexception);
1494 fdwrite.fd_count = 1;
1503 tv.tv_usec = (
timeout % 1000) * 1000;
1525#if defined (QTCPSOCKETENGINE_DEBUG)
1526 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.
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
Q_IPV6ADDR toIPv6Address() const
Returns the IPv6 address as a Q_IPV6ADDR structure.
QString toString() const
Returns the address as a string.
NetworkLayerProtocol protocol() const
Returns the network layer protocol of the host address.
const_reference at(qsizetype i) const noexcept
qsizetype count() 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
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)
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 &
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...
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
#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]
GLbitfield GLuint64 timeout
[4]
GLenum GLuint GLenum GLsizei const GLchar * buf
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint GLuint64EXT address
GLdouble GLdouble GLdouble GLdouble q
#define QStringLiteral(str)
QFileInfo info(fileName)
[8]
selection select(topLeft, bottomRight)
socketLayer bind(QHostAddress::Any, 4000)