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 if (d->nativeCheckConnection() && state() == QAbstractSocket::ConnectedState)
605 d->fetchConnectionParameters();
607 if (state() != QAbstractSocket::ConnectingState) {
609 QAbstractSocketEngine::connectionNotification();
640bool QNativeSocketEngine::bind(
const QHostAddress &address, quint16 port)
642 Q_D(QNativeSocketEngine);
645 if (!d->checkProxy(address))
648 Q_CHECK_STATE(QNativeSocketEngine::bind(), QAbstractSocket::UnconnectedState,
false);
650 if (!d->nativeBind(d->adjustAddressProtocol(address), port))
653 d->fetchConnectionParameters();
672bool QNativeSocketEngine::listen(
int backlog)
674 Q_D(QNativeSocketEngine);
676 Q_CHECK_STATE(QNativeSocketEngine::listen(), QAbstractSocket::BoundState,
false);
678 Q_CHECK_TYPES(QNativeSocketEngine::listen(), QAbstractSocket::TcpSocket,
679 QAbstractSocket::SctpSocket,
false);
681 Q_CHECK_TYPE(QNativeSocketEngine::listen(), QAbstractSocket::TcpSocket,
false);
684 return d->nativeListen(backlog);
694qintptr QNativeSocketEngine::accept()
696 Q_D(QNativeSocketEngine);
698 Q_CHECK_STATE(QNativeSocketEngine::accept(), QAbstractSocket::ListeningState, -1);
700 Q_CHECK_TYPES(QNativeSocketEngine::accept(), QAbstractSocket::TcpSocket,
701 QAbstractSocket::SctpSocket, -1);
703 Q_CHECK_TYPE(QNativeSocketEngine::accept(), QAbstractSocket::TcpSocket, -1);
706 return d->nativeAccept();
732bool QNativeSocketEngine::joinMulticastGroup(
const QHostAddress &groupAddress,
733 const QNetworkInterface &iface)
735 Q_D(QNativeSocketEngine);
737 Q_CHECK_STATE(QNativeSocketEngine::joinMulticastGroup(), QAbstractSocket::BoundState,
false);
738 Q_CHECK_TYPE(QNativeSocketEngine::joinMulticastGroup(), QAbstractSocket::UdpSocket,
false);
744 if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol &&
745 (d->socketProtocol == QAbstractSocket::IPv6Protocol ||
746 d->socketProtocol == QAbstractSocket::AnyIPProtocol)) {
747 qWarning(
"QAbstractSocket: cannot bind to QHostAddress::Any (or an IPv6 address) and join an IPv4 multicast group;"
748 " bind to QHostAddress::AnyIPv4 instead if you want to do this");
752 return d->nativeJoinMulticastGroup(groupAddress, iface);
758bool QNativeSocketEngine::leaveMulticastGroup(
const QHostAddress &groupAddress,
759 const QNetworkInterface &iface)
761 Q_D(QNativeSocketEngine);
763 Q_CHECK_STATE(QNativeSocketEngine::leaveMulticastGroup(), QAbstractSocket::BoundState,
false);
764 Q_CHECK_TYPE(QNativeSocketEngine::leaveMulticastGroup(), QAbstractSocket::UdpSocket,
false);
765 return d->nativeLeaveMulticastGroup(groupAddress, iface);
838qint64 QNativeSocketEngine::readDatagram(
char *data, qint64 maxSize, QIpPacketHeader *header,
839 PacketHeaderOptions options)
841 Q_D(QNativeSocketEngine);
843 Q_CHECK_STATES(QNativeSocketEngine::readDatagram(), QAbstractSocket::BoundState,
844 QAbstractSocket::ConnectedState, -1);
846 return d->nativeReceiveDatagram(data, maxSize, header, options);
871qint64 QNativeSocketEngine::writeDatagram(
const char *data, qint64 size,
const QIpPacketHeader &header)
873 Q_D(QNativeSocketEngine);
875 Q_CHECK_STATES(QNativeSocketEngine::writeDatagram(), QAbstractSocket::BoundState,
876 QAbstractSocket::ConnectedState, -1);
878 return d->nativeSendDatagram(data, size, header);
907qint64 QNativeSocketEngine::read(
char *data, qint64 maxSize)
909 Q_D(QNativeSocketEngine);
911 Q_CHECK_STATES(QNativeSocketEngine::read(), QAbstractSocket::ConnectedState, QAbstractSocket::BoundState, -1);
913 qint64 readBytes = d->nativeRead(data, maxSize);
919 if (readBytes == 0 && d->socketType != QAbstractSocket::UdpSocket) {
920 d->setError(QAbstractSocket::RemoteHostClosedError,
921 QNativeSocketEnginePrivate::RemoteHostClosedErrorString);
924 }
else if (readBytes == -1) {
925 if (!d->hasSetSocketError) {
926 d->hasSetSocketError =
true;
927 d->socketError = QAbstractSocket::NetworkError;
928 d->socketErrorString = qt_error_string();
940void QNativeSocketEngine::close()
942 Q_D(QNativeSocketEngine);
944 d->readNotifier->setEnabled(
false);
945 if (d->writeNotifier)
946 d->writeNotifier->setEnabled(
false);
947 if (d->exceptNotifier)
948 d->exceptNotifier->setEnabled(
false);
950 if (d->socketDescriptor != -1) {
952 d->socketDescriptor = -1;
954 d->socketState = QAbstractSocket::UnconnectedState;
955 d->hasSetSocketError =
false;
957 d->localAddress.clear();
959 d->peerAddress.clear();
960 d->inboundStreamCount = d->outboundStreamCount = 0;
961 if (d->readNotifier) {
962 delete d->readNotifier;
963 d->readNotifier =
nullptr;
965 if (d->writeNotifier) {
966 delete d->writeNotifier;
967 d->writeNotifier =
nullptr;
969 if (d->exceptNotifier) {
970 delete d->exceptNotifier;
971 d->exceptNotifier =
nullptr;
990bool QNativeSocketEngine::waitForRead(QDeadlineTimer deadline,
bool *timedOut)
992 Q_D(
const QNativeSocketEngine);
995 QAbstractSocket::UnconnectedState,
false);
1000 int ret = d->nativeSelect(deadline,
true);
1004 d->setError(QAbstractSocket::SocketTimeoutError,
1005 QNativeSocketEnginePrivate::TimeOutErrorString);
1006 d->hasSetSocketError =
false;
1008 }
else if (state() == QAbstractSocket::ConnectingState) {
1009 connectToHost(d->peerAddress, d->peerPort);
1030bool QNativeSocketEngine::waitForWrite(QDeadlineTimer deadline,
bool *timedOut)
1032 Q_D(QNativeSocketEngine);
1035 QAbstractSocket::UnconnectedState,
false);
1040 int ret = d->nativeSelect(deadline,
false);
1044#if defined (Q_OS_WIN)
1045 if (state() == QAbstractSocket::ConnectingState) {
1047 setState(QAbstractSocket::ConnectedState);
1048 d_func()->fetchConnectionParameters();
1052 int valueSize =
sizeof(value);
1053 if (::getsockopt(d->socketDescriptor, SOL_SOCKET, SO_ERROR, (
char *) &value, &valueSize) == 0) {
1054 if (value == WSAECONNREFUSED) {
1055 d->setError(QAbstractSocket::ConnectionRefusedError, QNativeSocketEnginePrivate::ConnectionRefusedErrorString);
1056 d->socketState = QAbstractSocket::UnconnectedState;
1058 }
else if (value == WSAETIMEDOUT) {
1059 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::ConnectionTimeOutErrorString);
1060 d->socketState = QAbstractSocket::UnconnectedState;
1062 }
else if (value == WSAEHOSTUNREACH) {
1063 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::HostUnreachableErrorString);
1064 d->socketState = QAbstractSocket::UnconnectedState;
1075 d->setError(QAbstractSocket::SocketTimeoutError,
1076 QNativeSocketEnginePrivate::TimeOutErrorString);
1077 d->hasSetSocketError =
false;
1079 }
else if (state() == QAbstractSocket::ConnectingState || (state() == QAbstractSocket::BoundState && d->socketDescriptor != -1)) {
1080 connectToHost(d->peerAddress, d->peerPort);
1086bool QNativeSocketEngine::waitForReadOrWrite(
bool *readyToRead,
bool *readyToWrite,
1087 bool checkRead,
bool checkWrite,
1088 QDeadlineTimer deadline,
bool *timedOut)
1090 Q_D(QNativeSocketEngine);
1093 QAbstractSocket::UnconnectedState,
false);
1095 int ret = d->nativeSelect(deadline, checkRead, checkWrite, readyToRead, readyToWrite);
1099#if defined (Q_OS_WIN)
1100 if (state() == QAbstractSocket::ConnectingState) {
1101 if (checkWrite && ((readyToWrite && *readyToWrite) || !readyToWrite) && ret > 0) {
1102 setState(QAbstractSocket::ConnectedState);
1103 d_func()->fetchConnectionParameters();
1107 int valueSize =
sizeof(value);
1108 if (::getsockopt(d->socketDescriptor, SOL_SOCKET, SO_ERROR, (
char *) &value, &valueSize) == 0) {
1109 if (value == WSAECONNREFUSED) {
1110 d->setError(QAbstractSocket::ConnectionRefusedError, QNativeSocketEnginePrivate::ConnectionRefusedErrorString);
1111 d->socketState = QAbstractSocket::UnconnectedState;
1113 }
else if (value == WSAETIMEDOUT) {
1114 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::ConnectionTimeOutErrorString);
1115 d->socketState = QAbstractSocket::UnconnectedState;
1117 }
else if (value == WSAEHOSTUNREACH) {
1118 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::HostUnreachableErrorString);
1119 d->socketState = QAbstractSocket::UnconnectedState;
1129 d->setError(QAbstractSocket::SocketTimeoutError,
1130 QNativeSocketEnginePrivate::TimeOutErrorString);
1131 d->hasSetSocketError =
false;
1133 }
else if (state() == QAbstractSocket::ConnectingState) {
1134 connectToHost(d->peerAddress, d->peerPort);
1314void QNativeSocketEngine::setReadNotificationEnabled(
bool enable)
1316 Q_D(QNativeSocketEngine);
1317 if (d->readNotifier) {
1318 d->readNotifier->setEnabled(enable);
1319 }
else if (enable && d->threadData.loadRelaxed()->hasEventDispatcher()) {
1320 d->readNotifier =
new QReadNotifier(d->socketDescriptor,
this);
1321 d->readNotifier->setEnabled(
true);
1331void QNativeSocketEngine::setWriteNotificationEnabled(
bool enable)
1333 Q_D(QNativeSocketEngine);
1334 if (d->writeNotifier) {
1335 d->writeNotifier->setEnabled(enable);
1336 }
else if (enable && d->threadData.loadRelaxed()->hasEventDispatcher()) {
1337 d->writeNotifier =
new QWriteNotifier(d->socketDescriptor,
this);
1338 d->writeNotifier->setEnabled(
true);
1348void QNativeSocketEngine::setExceptionNotificationEnabled(
bool enable)
1350 Q_D(QNativeSocketEngine);
1351 if (d->exceptNotifier) {
1352 d->exceptNotifier->setEnabled(enable);
1353 }
else if (enable && d->threadData.loadRelaxed()->hasEventDispatcher()) {
1354 d->exceptNotifier =
new QExceptionNotifier(d->socketDescriptor,
this);
1355 d->exceptNotifier->setEnabled(
true);