190 if (hasSetSocketError) {
200 if (error != QAbstractSocket::SocketError(11))
201 hasSetSocketError =
true;
205 switch (errorString) {
206 case NonBlockingInitFailedErrorString:
207 socketErrorString = QNativeSocketEngine::tr(
"Unable to initialize non-blocking socket");
209 case BroadcastingInitFailedErrorString:
210 socketErrorString = QNativeSocketEngine::tr(
"Unable to initialize broadcast socket");
213 case NoIpV6ErrorString:
214 socketErrorString = QNativeSocketEngine::tr(
"Attempt to use IPv6 socket on a platform with no IPv6 support");
216 case RemoteHostClosedErrorString:
217 socketErrorString = QNativeSocketEngine::tr(
"The remote host closed the connection");
219 case TimeOutErrorString:
220 socketErrorString = QNativeSocketEngine::tr(
"Network operation timed out");
222 case ResourceErrorString:
223 socketErrorString = QNativeSocketEngine::tr(
"Out of resources");
225 case OperationUnsupportedErrorString:
226 socketErrorString = QNativeSocketEngine::tr(
"Unsupported socket operation");
228 case ProtocolUnsupportedErrorString:
229 socketErrorString = QNativeSocketEngine::tr(
"Protocol type not supported");
231 case InvalidSocketErrorString:
232 socketErrorString = QNativeSocketEngine::tr(
"Invalid socket descriptor");
234 case HostUnreachableErrorString:
235 socketErrorString = QNativeSocketEngine::tr(
"Host unreachable");
237 case NetworkUnreachableErrorString:
238 socketErrorString = QNativeSocketEngine::tr(
"Network unreachable");
240 case AccessErrorString:
241 socketErrorString = QNativeSocketEngine::tr(
"Permission denied");
243 case ConnectionTimeOutErrorString:
244 socketErrorString = QNativeSocketEngine::tr(
"Connection timed out");
246 case ConnectionRefusedErrorString:
247 socketErrorString = QNativeSocketEngine::tr(
"Connection refused");
249 case AddressInuseErrorString:
250 socketErrorString = QNativeSocketEngine::tr(
"The bound address is already in use");
252 case AddressNotAvailableErrorString:
253 socketErrorString = QNativeSocketEngine::tr(
"The address is not available");
255 case AddressProtectedErrorString:
256 socketErrorString = QNativeSocketEngine::tr(
"The address is protected");
258 case DatagramTooLargeErrorString:
259 socketErrorString = QNativeSocketEngine::tr(
"Datagram was too large to send");
261 case SendDatagramErrorString:
262 socketErrorString = QNativeSocketEngine::tr(
"Unable to send a message");
264 case ReceiveDatagramErrorString:
265 socketErrorString = QNativeSocketEngine::tr(
"Unable to receive a message");
267 case WriteErrorString:
268 socketErrorString = QNativeSocketEngine::tr(
"Unable to write");
270 case ReadErrorString:
271 socketErrorString = QNativeSocketEngine::tr(
"Network error");
273 case PortInuseErrorString:
274 socketErrorString = QNativeSocketEngine::tr(
"Another socket is already listening on the same port");
276 case NotSocketErrorString:
277 socketErrorString = QNativeSocketEngine::tr(
"Operation on non-socket");
279 case InvalidProxyTypeString:
280 socketErrorString = QNativeSocketEngine::tr(
"The proxy type is invalid for this operation");
282 case TemporaryErrorString:
283 socketErrorString = QNativeSocketEngine::tr(
"Temporary error");
285 case NetworkDroppedConnectionErrorString:
286 socketErrorString = QNativeSocketEngine::tr(
"Network dropped connection on reset");
288 case ConnectionResetErrorString:
289 socketErrorString = QNativeSocketEngine::tr(
"Connection reset by peer");
291 case UnknownSocketErrorString:
292 socketErrorString = QNativeSocketEngine::tr(
"Unknown error");
306 QAbstractSocket::NetworkLayerProtocol targetProtocol = socketProtocol;
307 if (Q_LIKELY(targetProtocol == QAbstractSocket::UnknownNetworkLayerProtocol))
310 QAbstractSocket::NetworkLayerProtocol sourceProtocol = address.protocol();
312 if (targetProtocol == QAbstractSocket::AnyIPProtocol)
313 targetProtocol = QAbstractSocket::IPv6Protocol;
314 if (targetProtocol == QAbstractSocket::IPv6Protocol && sourceProtocol == QAbstractSocket::IPv4Protocol) {
316 return QHostAddress(address.toIPv6Address());
319 if (targetProtocol == QAbstractSocket::IPv4Protocol && sourceProtocol == QAbstractSocket::IPv6Protocol) {
321 quint32 ip4 = address.toIPv4Address();
323 return QHostAddress(ip4);
331 if (address.isLoopback())
334#if !defined(QT_NO_NETWORKPROXY)
335 QObject *parent = q_func()->parent();
337 QNetworkProxyQuery::QueryType queryType = QNetworkProxyQuery::TcpSocket;
338 if (QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(parent)) {
339 proxy = socket->proxy();
340 switch (socket->socketType()) {
341 case QAbstractSocket::UdpSocket:
342 queryType = QNetworkProxyQuery::UdpSocket;
344 case QAbstractSocket::SctpSocket:
345 queryType = QNetworkProxyQuery::SctpSocket;
347 case QAbstractSocket::TcpSocket:
348 case QAbstractSocket::UnknownSocketType:
349 queryType = QNetworkProxyQuery::TcpSocket;
351 }
else if (QTcpServer *server = qobject_cast<QTcpServer *>(parent)) {
352 proxy = server->proxy();
353 queryType = QNetworkProxyQuery::TcpServer;
355 if (qobject_cast<QSctpServer *>(server))
356 queryType = QNetworkProxyQuery::SctpServer;
363 if (proxy.type() == QNetworkProxy::DefaultProxy) {
369 query.setQueryType(queryType);
370 proxy = QNetworkProxyFactory::proxyForQuery(query).constFirst();
373 if (proxy.type() != QNetworkProxy::DefaultProxy &&
374 proxy.type() != QNetworkProxy::NoProxy) {
376 setError(QAbstractSocket::UnsupportedSocketOperationError,
377 QNativeSocketEnginePrivate::InvalidProxyTypeString);
414bool QNativeSocketEngine::initialize(QAbstractSocket::SocketType socketType, QAbstractSocket::NetworkLayerProtocol protocol)
416 Q_D(QNativeSocketEngine);
421 if (!d->createNewSocket(socketType, protocol)) {
422#if defined (QNATIVESOCKETENGINE_DEBUG)
423 QString typeStr =
"UnknownSocketType"_L1;
424 if (socketType == QAbstractSocket::TcpSocket) typeStr =
"TcpSocket"_L1;
425 else if (socketType == QAbstractSocket::UdpSocket) typeStr =
"UdpSocket"_L1;
426 else if (socketType == QAbstractSocket::SctpSocket) typeStr =
"SctpSocket"_L1;
427 QString protocolStr =
"UnknownProtocol"_L1;
428 if (protocol == QAbstractSocket::IPv4Protocol) protocolStr =
"IPv4Protocol"_L1;
429 else if (protocol == QAbstractSocket::IPv6Protocol) protocolStr =
"IPv6Protocol"_L1;
430 qDebug(
"QNativeSocketEngine::initialize(type == %s, protocol == %s) failed: %s",
431 typeStr.toLatin1().constData(), protocolStr.toLatin1().constData(), d->socketErrorString.toLatin1().constData());
436 if (socketType == QAbstractSocket::UdpSocket) {
439 if (protocol != QAbstractSocket::IPv6Protocol) {
440 if (!setOption(BroadcastSocketOption, 1)) {
441 d->setError(QAbstractSocket::UnsupportedSocketOperationError,
442 QNativeSocketEnginePrivate::BroadcastingInitFailedErrorString);
449 setOption(ReceivePacketInformation, 1);
450 setOption(ReceiveHopLimit, 1);
456 if (socketType == QAbstractSocket::TcpSocket
457 && !setOption(ReceiveOutOfBandData, 1)) {
458 qWarning(
"QNativeSocketEngine::initialize unable to inline out-of-band data");
489bool QNativeSocketEngine::initialize(qintptr socketDescriptor, QAbstractSocket::SocketState socketState)
491 Q_D(QNativeSocketEngine);
496 d->socketDescriptor = socketDescriptor;
499 if (!d->fetchConnectionParameters()) {
500#if defined (QNATIVESOCKETENGINE_DEBUG)
501 qDebug() <<
"QNativeSocketEngine::initialize(socketDescriptor) failed:"
502 << socketDescriptor << d->socketErrorString;
504 d->socketDescriptor = -1;
508 if (d->socketType != QAbstractSocket::UnknownSocketType) {
510 if (!setOption(NonBlockingSocketOption, 1)) {
511 d->setError(QAbstractSocket::UnsupportedSocketOperationError,
512 QNativeSocketEnginePrivate::NonBlockingInitFailedErrorString);
518 if (d->socketType == QAbstractSocket::UdpSocket
519 && d->socketProtocol != QAbstractSocket::IPv6Protocol
520 && !setOption(BroadcastSocketOption, 1)) {
521 d->setError(QAbstractSocket::UnsupportedSocketOperationError,
522 QNativeSocketEnginePrivate::BroadcastingInitFailedErrorString);
528 d->socketState = socketState;
575bool QNativeSocketEngine::connectToHost(
const QHostAddress &address, quint16 port)
577 Q_D(QNativeSocketEngine);
580 if (!d->checkProxy(address))
583 Q_CHECK_STATES3(QNativeSocketEngine::connectToHost(), QAbstractSocket::BoundState,
584 QAbstractSocket::UnconnectedState, QAbstractSocket::ConnectingState,
false);
586 d->peerAddress = address;
588 bool connected = d->nativeConnect(d->adjustAddressProtocol(address), port);
590 d->fetchConnectionParameters();
599void QNativeSocketEngine::connectionNotification()
601 Q_D(QNativeSocketEngine);
602 Q_ASSERT(state() == QAbstractSocket::ConnectingState);
604 connectToHost(d->peerAddress, d->peerPort);
605 if (state() != QAbstractSocket::ConnectingState) {
607 QAbstractSocketEngine::connectionNotification();
638bool QNativeSocketEngine::bind(
const QHostAddress &address, quint16 port)
640 Q_D(QNativeSocketEngine);
643 if (!d->checkProxy(address))
646 Q_CHECK_STATE(QNativeSocketEngine::bind(), QAbstractSocket::UnconnectedState,
false);
648 if (!d->nativeBind(d->adjustAddressProtocol(address), port))
651 d->fetchConnectionParameters();
670bool QNativeSocketEngine::listen(
int backlog)
672 Q_D(QNativeSocketEngine);
674 Q_CHECK_STATE(QNativeSocketEngine::listen(), QAbstractSocket::BoundState,
false);
676 Q_CHECK_TYPES(QNativeSocketEngine::listen(), QAbstractSocket::TcpSocket,
677 QAbstractSocket::SctpSocket,
false);
679 Q_CHECK_TYPE(QNativeSocketEngine::listen(), QAbstractSocket::TcpSocket,
false);
682 return d->nativeListen(backlog);
692qintptr QNativeSocketEngine::accept()
694 Q_D(QNativeSocketEngine);
696 Q_CHECK_STATE(QNativeSocketEngine::accept(), QAbstractSocket::ListeningState, -1);
698 Q_CHECK_TYPES(QNativeSocketEngine::accept(), QAbstractSocket::TcpSocket,
699 QAbstractSocket::SctpSocket, -1);
701 Q_CHECK_TYPE(QNativeSocketEngine::accept(), QAbstractSocket::TcpSocket, -1);
704 return d->nativeAccept();
730bool QNativeSocketEngine::joinMulticastGroup(
const QHostAddress &groupAddress,
731 const QNetworkInterface &iface)
733 Q_D(QNativeSocketEngine);
735 Q_CHECK_STATE(QNativeSocketEngine::joinMulticastGroup(), QAbstractSocket::BoundState,
false);
736 Q_CHECK_TYPE(QNativeSocketEngine::joinMulticastGroup(), QAbstractSocket::UdpSocket,
false);
742 if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol &&
743 (d->socketProtocol == QAbstractSocket::IPv6Protocol ||
744 d->socketProtocol == QAbstractSocket::AnyIPProtocol)) {
745 qWarning(
"QAbstractSocket: cannot bind to QHostAddress::Any (or an IPv6 address) and join an IPv4 multicast group;"
746 " bind to QHostAddress::AnyIPv4 instead if you want to do this");
750 return d->nativeJoinMulticastGroup(groupAddress, iface);
756bool QNativeSocketEngine::leaveMulticastGroup(
const QHostAddress &groupAddress,
757 const QNetworkInterface &iface)
759 Q_D(QNativeSocketEngine);
761 Q_CHECK_STATE(QNativeSocketEngine::leaveMulticastGroup(), QAbstractSocket::BoundState,
false);
762 Q_CHECK_TYPE(QNativeSocketEngine::leaveMulticastGroup(), QAbstractSocket::UdpSocket,
false);
763 return d->nativeLeaveMulticastGroup(groupAddress, iface);
836qint64 QNativeSocketEngine::readDatagram(
char *data, qint64 maxSize, QIpPacketHeader *header,
837 PacketHeaderOptions options)
839 Q_D(QNativeSocketEngine);
841 Q_CHECK_STATES(QNativeSocketEngine::readDatagram(), QAbstractSocket::BoundState,
842 QAbstractSocket::ConnectedState, -1);
844 return d->nativeReceiveDatagram(data, maxSize, header, options);
869qint64 QNativeSocketEngine::writeDatagram(
const char *data, qint64 size,
const QIpPacketHeader &header)
871 Q_D(QNativeSocketEngine);
873 Q_CHECK_STATES(QNativeSocketEngine::writeDatagram(), QAbstractSocket::BoundState,
874 QAbstractSocket::ConnectedState, -1);
876 return d->nativeSendDatagram(data, size, header);
905qint64 QNativeSocketEngine::read(
char *data, qint64 maxSize)
907 Q_D(QNativeSocketEngine);
909 Q_CHECK_STATES(QNativeSocketEngine::read(), QAbstractSocket::ConnectedState, QAbstractSocket::BoundState, -1);
911 qint64 readBytes = d->nativeRead(data, maxSize);
917 if (readBytes == 0 && d->socketType != QAbstractSocket::UdpSocket) {
918 d->setError(QAbstractSocket::RemoteHostClosedError,
919 QNativeSocketEnginePrivate::RemoteHostClosedErrorString);
922 }
else if (readBytes == -1) {
923 if (!d->hasSetSocketError) {
924 d->hasSetSocketError =
true;
925 d->socketError = QAbstractSocket::NetworkError;
926 d->socketErrorString = qt_error_string();
938void QNativeSocketEngine::close()
940 Q_D(QNativeSocketEngine);
942 d->readNotifier->setEnabled(
false);
943 if (d->writeNotifier)
944 d->writeNotifier->setEnabled(
false);
945 if (d->exceptNotifier)
946 d->exceptNotifier->setEnabled(
false);
948 if (d->socketDescriptor != -1) {
950 d->socketDescriptor = -1;
952 d->socketState = QAbstractSocket::UnconnectedState;
953 d->hasSetSocketError =
false;
955 d->localAddress.clear();
957 d->peerAddress.clear();
958 d->inboundStreamCount = d->outboundStreamCount = 0;
959 if (d->readNotifier) {
960 delete d->readNotifier;
961 d->readNotifier =
nullptr;
963 if (d->writeNotifier) {
964 delete d->writeNotifier;
965 d->writeNotifier =
nullptr;
967 if (d->exceptNotifier) {
968 delete d->exceptNotifier;
969 d->exceptNotifier =
nullptr;
988bool QNativeSocketEngine::waitForRead(QDeadlineTimer deadline,
bool *timedOut)
990 Q_D(
const QNativeSocketEngine);
993 QAbstractSocket::UnconnectedState,
false);
998 int ret = d->nativeSelect(deadline,
true);
1002 d->setError(QAbstractSocket::SocketTimeoutError,
1003 QNativeSocketEnginePrivate::TimeOutErrorString);
1004 d->hasSetSocketError =
false;
1006 }
else if (state() == QAbstractSocket::ConnectingState) {
1007 connectToHost(d->peerAddress, d->peerPort);
1028bool QNativeSocketEngine::waitForWrite(QDeadlineTimer deadline,
bool *timedOut)
1030 Q_D(QNativeSocketEngine);
1033 QAbstractSocket::UnconnectedState,
false);
1038 int ret = d->nativeSelect(deadline,
false);
1042#if defined (Q_OS_WIN)
1043 if (state() == QAbstractSocket::ConnectingState) {
1045 setState(QAbstractSocket::ConnectedState);
1046 d_func()->fetchConnectionParameters();
1050 int valueSize =
sizeof(value);
1051 if (::getsockopt(d->socketDescriptor, SOL_SOCKET, SO_ERROR, (
char *) &value, &valueSize) == 0) {
1052 if (value == WSAECONNREFUSED) {
1053 d->setError(QAbstractSocket::ConnectionRefusedError, QNativeSocketEnginePrivate::ConnectionRefusedErrorString);
1054 d->socketState = QAbstractSocket::UnconnectedState;
1056 }
else if (value == WSAETIMEDOUT) {
1057 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::ConnectionTimeOutErrorString);
1058 d->socketState = QAbstractSocket::UnconnectedState;
1060 }
else if (value == WSAEHOSTUNREACH) {
1061 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::HostUnreachableErrorString);
1062 d->socketState = QAbstractSocket::UnconnectedState;
1073 d->setError(QAbstractSocket::SocketTimeoutError,
1074 QNativeSocketEnginePrivate::TimeOutErrorString);
1075 d->hasSetSocketError =
false;
1077 }
else if (state() == QAbstractSocket::ConnectingState || (state() == QAbstractSocket::BoundState && d->socketDescriptor != -1)) {
1078 connectToHost(d->peerAddress, d->peerPort);
1084bool QNativeSocketEngine::waitForReadOrWrite(
bool *readyToRead,
bool *readyToWrite,
1085 bool checkRead,
bool checkWrite,
1086 QDeadlineTimer deadline,
bool *timedOut)
1088 Q_D(QNativeSocketEngine);
1091 QAbstractSocket::UnconnectedState,
false);
1093 int ret = d->nativeSelect(deadline, checkRead, checkWrite, readyToRead, readyToWrite);
1097#if defined (Q_OS_WIN)
1098 if (state() == QAbstractSocket::ConnectingState) {
1099 if (checkWrite && ((readyToWrite && *readyToWrite) || !readyToWrite) && ret > 0) {
1100 setState(QAbstractSocket::ConnectedState);
1101 d_func()->fetchConnectionParameters();
1105 int valueSize =
sizeof(value);
1106 if (::getsockopt(d->socketDescriptor, SOL_SOCKET, SO_ERROR, (
char *) &value, &valueSize) == 0) {
1107 if (value == WSAECONNREFUSED) {
1108 d->setError(QAbstractSocket::ConnectionRefusedError, QNativeSocketEnginePrivate::ConnectionRefusedErrorString);
1109 d->socketState = QAbstractSocket::UnconnectedState;
1111 }
else if (value == WSAETIMEDOUT) {
1112 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::ConnectionTimeOutErrorString);
1113 d->socketState = QAbstractSocket::UnconnectedState;
1115 }
else if (value == WSAEHOSTUNREACH) {
1116 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::HostUnreachableErrorString);
1117 d->socketState = QAbstractSocket::UnconnectedState;
1127 d->setError(QAbstractSocket::SocketTimeoutError,
1128 QNativeSocketEnginePrivate::TimeOutErrorString);
1129 d->hasSetSocketError =
false;
1131 }
else if (state() == QAbstractSocket::ConnectingState) {
1132 connectToHost(d->peerAddress, d->peerPort);
1312void QNativeSocketEngine::setReadNotificationEnabled(
bool enable)
1314 Q_D(QNativeSocketEngine);
1315 if (d->readNotifier) {
1316 d->readNotifier->setEnabled(enable);
1317 }
else if (enable && d->threadData.loadRelaxed()->hasEventDispatcher()) {
1318 d->readNotifier =
new QReadNotifier(d->socketDescriptor,
this);
1319 d->readNotifier->setEnabled(
true);
1329void QNativeSocketEngine::setWriteNotificationEnabled(
bool enable)
1331 Q_D(QNativeSocketEngine);
1332 if (d->writeNotifier) {
1333 d->writeNotifier->setEnabled(enable);
1334 }
else if (enable && d->threadData.loadRelaxed()->hasEventDispatcher()) {
1335 d->writeNotifier =
new QWriteNotifier(d->socketDescriptor,
this);
1336 d->writeNotifier->setEnabled(
true);
1346void QNativeSocketEngine::setExceptionNotificationEnabled(
bool enable)
1348 Q_D(QNativeSocketEngine);
1349 if (d->exceptNotifier) {
1350 d->exceptNotifier->setEnabled(enable);
1351 }
else if (enable && d->threadData.loadRelaxed()->hasEventDispatcher()) {
1352 d->exceptNotifier =
new QExceptionNotifier(d->socketDescriptor,
this);
1353 d->exceptNotifier->setEnabled(
true);