184 if (hasSetSocketError) {
194 if (error != QAbstractSocket::SocketError(11))
195 hasSetSocketError =
true;
199 switch (errorString) {
200 case NonBlockingInitFailedErrorString:
201 socketErrorString = QNativeSocketEngine::tr(
"Unable to initialize non-blocking socket");
203 case BroadcastingInitFailedErrorString:
204 socketErrorString = QNativeSocketEngine::tr(
"Unable to initialize broadcast socket");
207 case NoIpV6ErrorString:
208 socketErrorString = QNativeSocketEngine::tr(
"Attempt to use IPv6 socket on a platform with no IPv6 support");
210 case RemoteHostClosedErrorString:
211 socketErrorString = QNativeSocketEngine::tr(
"The remote host closed the connection");
213 case TimeOutErrorString:
214 socketErrorString = QNativeSocketEngine::tr(
"Network operation timed out");
216 case ResourceErrorString:
217 socketErrorString = QNativeSocketEngine::tr(
"Out of resources");
219 case OperationUnsupportedErrorString:
220 socketErrorString = QNativeSocketEngine::tr(
"Unsupported socket operation");
222 case ProtocolUnsupportedErrorString:
223 socketErrorString = QNativeSocketEngine::tr(
"Protocol type not supported");
225 case InvalidSocketErrorString:
226 socketErrorString = QNativeSocketEngine::tr(
"Invalid socket descriptor");
228 case HostUnreachableErrorString:
229 socketErrorString = QNativeSocketEngine::tr(
"Host unreachable");
231 case NetworkUnreachableErrorString:
232 socketErrorString = QNativeSocketEngine::tr(
"Network unreachable");
234 case AccessErrorString:
235 socketErrorString = QNativeSocketEngine::tr(
"Permission denied");
237 case ConnectionTimeOutErrorString:
238 socketErrorString = QNativeSocketEngine::tr(
"Connection timed out");
240 case ConnectionRefusedErrorString:
241 socketErrorString = QNativeSocketEngine::tr(
"Connection refused");
243 case AddressInuseErrorString:
244 socketErrorString = QNativeSocketEngine::tr(
"The bound address is already in use");
246 case AddressNotAvailableErrorString:
247 socketErrorString = QNativeSocketEngine::tr(
"The address is not available");
249 case AddressProtectedErrorString:
250 socketErrorString = QNativeSocketEngine::tr(
"The address is protected");
252 case DatagramTooLargeErrorString:
253 socketErrorString = QNativeSocketEngine::tr(
"Datagram was too large to send");
255 case SendDatagramErrorString:
256 socketErrorString = QNativeSocketEngine::tr(
"Unable to send a message");
258 case ReceiveDatagramErrorString:
259 socketErrorString = QNativeSocketEngine::tr(
"Unable to receive a message");
261 case WriteErrorString:
262 socketErrorString = QNativeSocketEngine::tr(
"Unable to write");
264 case ReadErrorString:
265 socketErrorString = QNativeSocketEngine::tr(
"Network error");
267 case PortInuseErrorString:
268 socketErrorString = QNativeSocketEngine::tr(
"Another socket is already listening on the same port");
270 case NotSocketErrorString:
271 socketErrorString = QNativeSocketEngine::tr(
"Operation on non-socket");
273 case InvalidProxyTypeString:
274 socketErrorString = QNativeSocketEngine::tr(
"The proxy type is invalid for this operation");
276 case TemporaryErrorString:
277 socketErrorString = QNativeSocketEngine::tr(
"Temporary error");
279 case NetworkDroppedConnectionErrorString:
280 socketErrorString = QNativeSocketEngine::tr(
"Network dropped connection on reset");
282 case ConnectionResetErrorString:
283 socketErrorString = QNativeSocketEngine::tr(
"Connection reset by peer");
285 case UnknownSocketErrorString:
286 socketErrorString = QNativeSocketEngine::tr(
"Unknown error");
300 QAbstractSocket::NetworkLayerProtocol targetProtocol = socketProtocol;
301 if (Q_LIKELY(targetProtocol == QAbstractSocket::UnknownNetworkLayerProtocol))
304 QAbstractSocket::NetworkLayerProtocol sourceProtocol = address.protocol();
306 if (targetProtocol == QAbstractSocket::AnyIPProtocol)
307 targetProtocol = QAbstractSocket::IPv6Protocol;
308 if (targetProtocol == QAbstractSocket::IPv6Protocol && sourceProtocol == QAbstractSocket::IPv4Protocol) {
310 return QHostAddress(address.toIPv6Address());
313 if (targetProtocol == QAbstractSocket::IPv4Protocol && sourceProtocol == QAbstractSocket::IPv6Protocol) {
315 quint32 ip4 = address.toIPv4Address();
317 return QHostAddress(ip4);
325 if (address.isLoopback())
328#if !defined(QT_NO_NETWORKPROXY)
329 QObject *parent = q_func()->parent();
331 QNetworkProxyQuery::QueryType queryType = QNetworkProxyQuery::TcpSocket;
332 if (QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(parent)) {
333 proxy = socket->proxy();
334 switch (socket->socketType()) {
335 case QAbstractSocket::UdpSocket:
336 queryType = QNetworkProxyQuery::UdpSocket;
338 case QAbstractSocket::SctpSocket:
339 queryType = QNetworkProxyQuery::SctpSocket;
341 case QAbstractSocket::TcpSocket:
342 case QAbstractSocket::UnknownSocketType:
343 queryType = QNetworkProxyQuery::TcpSocket;
345 }
else if (QTcpServer *server = qobject_cast<QTcpServer *>(parent)) {
346 proxy = server->proxy();
347 queryType = QNetworkProxyQuery::TcpServer;
349 if (qobject_cast<QSctpServer *>(server))
350 queryType = QNetworkProxyQuery::SctpServer;
357 if (proxy.type() == QNetworkProxy::DefaultProxy) {
363 query.setQueryType(queryType);
364 proxy = QNetworkProxyFactory::proxyForQuery(query).constFirst();
367 if (proxy.type() != QNetworkProxy::DefaultProxy &&
368 proxy.type() != QNetworkProxy::NoProxy) {
370 setError(QAbstractSocket::UnsupportedSocketOperationError,
371 QNativeSocketEnginePrivate::InvalidProxyTypeString);
408bool QNativeSocketEngine::initialize(QAbstractSocket::SocketType socketType, QAbstractSocket::NetworkLayerProtocol protocol)
410 Q_D(QNativeSocketEngine);
415 if (!d->createNewSocket(socketType, protocol)) {
416#if defined (QNATIVESOCKETENGINE_DEBUG)
417 QString typeStr =
"UnknownSocketType"_L1;
418 if (socketType == QAbstractSocket::TcpSocket) typeStr =
"TcpSocket"_L1;
419 else if (socketType == QAbstractSocket::UdpSocket) typeStr =
"UdpSocket"_L1;
420 else if (socketType == QAbstractSocket::SctpSocket) typeStr =
"SctpSocket"_L1;
421 QString protocolStr =
"UnknownProtocol"_L1;
422 if (protocol == QAbstractSocket::IPv4Protocol) protocolStr =
"IPv4Protocol"_L1;
423 else if (protocol == QAbstractSocket::IPv6Protocol) protocolStr =
"IPv6Protocol"_L1;
424 qDebug(
"QNativeSocketEngine::initialize(type == %s, protocol == %s) failed: %s",
425 typeStr.toLatin1().constData(), protocolStr.toLatin1().constData(), d->socketErrorString.toLatin1().constData());
430 if (socketType == QAbstractSocket::UdpSocket) {
432 if (!setOption(BroadcastSocketOption, 1)) {
433 d->setError(QAbstractSocket::UnsupportedSocketOperationError,
434 QNativeSocketEnginePrivate::BroadcastingInitFailedErrorString);
440 setOption(ReceivePacketInformation, 1);
441 setOption(ReceiveHopLimit, 1);
447 if (socketType == QAbstractSocket::TcpSocket
448 && !setOption(ReceiveOutOfBandData, 1)) {
449 qWarning(
"QNativeSocketEngine::initialize unable to inline out-of-band data");
480bool QNativeSocketEngine::initialize(qintptr socketDescriptor, QAbstractSocket::SocketState socketState)
482 Q_D(QNativeSocketEngine);
487 d->socketDescriptor = socketDescriptor;
490 if (!d->fetchConnectionParameters()) {
491#if defined (QNATIVESOCKETENGINE_DEBUG)
492 qDebug() <<
"QNativeSocketEngine::initialize(socketDescriptor) failed:"
493 << socketDescriptor << d->socketErrorString;
495 d->socketDescriptor = -1;
499 if (d->socketType != QAbstractSocket::UnknownSocketType) {
501 if (!setOption(NonBlockingSocketOption, 1)) {
502 d->setError(QAbstractSocket::UnsupportedSocketOperationError,
503 QNativeSocketEnginePrivate::NonBlockingInitFailedErrorString);
509 if (d->socketType == QAbstractSocket::UdpSocket
510 && !setOption(BroadcastSocketOption, 1)) {
511 d->setError(QAbstractSocket::UnsupportedSocketOperationError,
512 QNativeSocketEnginePrivate::BroadcastingInitFailedErrorString);
518 d->socketState = socketState;
565bool QNativeSocketEngine::connectToHost(
const QHostAddress &address, quint16 port)
567 Q_D(QNativeSocketEngine);
570 if (!d->checkProxy(address))
573 Q_CHECK_STATES3(QNativeSocketEngine::connectToHost(), QAbstractSocket::BoundState,
574 QAbstractSocket::UnconnectedState, QAbstractSocket::ConnectingState,
false);
576 d->peerAddress = address;
578 bool connected = d->nativeConnect(d->adjustAddressProtocol(address), port);
580 d->fetchConnectionParameters();
589void QNativeSocketEngine::connectionNotification()
591 Q_D(QNativeSocketEngine);
592 Q_ASSERT(state() == QAbstractSocket::ConnectingState);
594 connectToHost(d->peerAddress, d->peerPort);
595 if (state() != QAbstractSocket::ConnectingState) {
597 QAbstractSocketEngine::connectionNotification();
628bool QNativeSocketEngine::bind(
const QHostAddress &address, quint16 port)
630 Q_D(QNativeSocketEngine);
633 if (!d->checkProxy(address))
636 Q_CHECK_STATE(QNativeSocketEngine::bind(), QAbstractSocket::UnconnectedState,
false);
638 if (!d->nativeBind(d->adjustAddressProtocol(address), port))
641 d->fetchConnectionParameters();
660bool QNativeSocketEngine::listen(
int backlog)
662 Q_D(QNativeSocketEngine);
664 Q_CHECK_STATE(QNativeSocketEngine::listen(), QAbstractSocket::BoundState,
false);
666 Q_CHECK_TYPES(QNativeSocketEngine::listen(), QAbstractSocket::TcpSocket,
667 QAbstractSocket::SctpSocket,
false);
669 Q_CHECK_TYPE(QNativeSocketEngine::listen(), QAbstractSocket::TcpSocket,
false);
672 return d->nativeListen(backlog);
682qintptr QNativeSocketEngine::accept()
684 Q_D(QNativeSocketEngine);
686 Q_CHECK_STATE(QNativeSocketEngine::accept(), QAbstractSocket::ListeningState, -1);
688 Q_CHECK_TYPES(QNativeSocketEngine::accept(), QAbstractSocket::TcpSocket,
689 QAbstractSocket::SctpSocket, -1);
691 Q_CHECK_TYPE(QNativeSocketEngine::accept(), QAbstractSocket::TcpSocket, -1);
694 return d->nativeAccept();
720bool QNativeSocketEngine::joinMulticastGroup(
const QHostAddress &groupAddress,
721 const QNetworkInterface &iface)
723 Q_D(QNativeSocketEngine);
725 Q_CHECK_STATE(QNativeSocketEngine::joinMulticastGroup(), QAbstractSocket::BoundState,
false);
726 Q_CHECK_TYPE(QNativeSocketEngine::joinMulticastGroup(), QAbstractSocket::UdpSocket,
false);
732 if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol &&
733 (d->socketProtocol == QAbstractSocket::IPv6Protocol ||
734 d->socketProtocol == QAbstractSocket::AnyIPProtocol)) {
735 qWarning(
"QAbstractSocket: cannot bind to QHostAddress::Any (or an IPv6 address) and join an IPv4 multicast group;"
736 " bind to QHostAddress::AnyIPv4 instead if you want to do this");
740 return d->nativeJoinMulticastGroup(groupAddress, iface);
746bool QNativeSocketEngine::leaveMulticastGroup(
const QHostAddress &groupAddress,
747 const QNetworkInterface &iface)
749 Q_D(QNativeSocketEngine);
751 Q_CHECK_STATE(QNativeSocketEngine::leaveMulticastGroup(), QAbstractSocket::BoundState,
false);
752 Q_CHECK_TYPE(QNativeSocketEngine::leaveMulticastGroup(), QAbstractSocket::UdpSocket,
false);
753 return d->nativeLeaveMulticastGroup(groupAddress, iface);
826qint64 QNativeSocketEngine::readDatagram(
char *data, qint64 maxSize, QIpPacketHeader *header,
827 PacketHeaderOptions options)
829 Q_D(QNativeSocketEngine);
831 Q_CHECK_STATES(QNativeSocketEngine::readDatagram(), QAbstractSocket::BoundState,
832 QAbstractSocket::ConnectedState, -1);
834 return d->nativeReceiveDatagram(data, maxSize, header, options);
859qint64 QNativeSocketEngine::writeDatagram(
const char *data, qint64 size,
const QIpPacketHeader &header)
861 Q_D(QNativeSocketEngine);
863 Q_CHECK_STATES(QNativeSocketEngine::writeDatagram(), QAbstractSocket::BoundState,
864 QAbstractSocket::ConnectedState, -1);
866 return d->nativeSendDatagram(data, size, header);
895qint64 QNativeSocketEngine::read(
char *data, qint64 maxSize)
897 Q_D(QNativeSocketEngine);
899 Q_CHECK_STATES(QNativeSocketEngine::read(), QAbstractSocket::ConnectedState, QAbstractSocket::BoundState, -1);
901 qint64 readBytes = d->nativeRead(data, maxSize);
904 if (readBytes == 0 && (d->socketType == QAbstractSocket::TcpSocket
906 || d->socketType == QAbstractSocket::SctpSocket
909 d->setError(QAbstractSocket::RemoteHostClosedError,
910 QNativeSocketEnginePrivate::RemoteHostClosedErrorString);
913 }
else if (readBytes == -1) {
914 if (!d->hasSetSocketError) {
915 d->hasSetSocketError =
true;
916 d->socketError = QAbstractSocket::NetworkError;
917 d->socketErrorString = qt_error_string();
929void QNativeSocketEngine::close()
931 Q_D(QNativeSocketEngine);
933 d->readNotifier->setEnabled(
false);
934 if (d->writeNotifier)
935 d->writeNotifier->setEnabled(
false);
936 if (d->exceptNotifier)
937 d->exceptNotifier->setEnabled(
false);
939 if (d->socketDescriptor != -1) {
941 d->socketDescriptor = -1;
943 d->socketState = QAbstractSocket::UnconnectedState;
944 d->hasSetSocketError =
false;
946 d->localAddress.clear();
948 d->peerAddress.clear();
949 d->inboundStreamCount = d->outboundStreamCount = 0;
950 if (d->readNotifier) {
951 delete d->readNotifier;
952 d->readNotifier =
nullptr;
954 if (d->writeNotifier) {
955 delete d->writeNotifier;
956 d->writeNotifier =
nullptr;
958 if (d->exceptNotifier) {
959 delete d->exceptNotifier;
960 d->exceptNotifier =
nullptr;
979bool QNativeSocketEngine::waitForRead(QDeadlineTimer deadline,
bool *timedOut)
981 Q_D(
const QNativeSocketEngine);
984 QAbstractSocket::UnconnectedState,
false);
989 int ret = d->nativeSelect(deadline,
true);
993 d->setError(QAbstractSocket::SocketTimeoutError,
994 QNativeSocketEnginePrivate::TimeOutErrorString);
995 d->hasSetSocketError =
false;
997 }
else if (state() == QAbstractSocket::ConnectingState) {
998 connectToHost(d->peerAddress, d->peerPort);
1019bool QNativeSocketEngine::waitForWrite(QDeadlineTimer deadline,
bool *timedOut)
1021 Q_D(QNativeSocketEngine);
1024 QAbstractSocket::UnconnectedState,
false);
1029 int ret = d->nativeSelect(deadline,
false);
1033#if defined (Q_OS_WIN)
1034 if (state() == QAbstractSocket::ConnectingState) {
1036 setState(QAbstractSocket::ConnectedState);
1037 d_func()->fetchConnectionParameters();
1041 int valueSize =
sizeof(value);
1042 if (::getsockopt(d->socketDescriptor, SOL_SOCKET, SO_ERROR, (
char *) &value, &valueSize) == 0) {
1043 if (value == WSAECONNREFUSED) {
1044 d->setError(QAbstractSocket::ConnectionRefusedError, QNativeSocketEnginePrivate::ConnectionRefusedErrorString);
1045 d->socketState = QAbstractSocket::UnconnectedState;
1047 }
else if (value == WSAETIMEDOUT) {
1048 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::ConnectionTimeOutErrorString);
1049 d->socketState = QAbstractSocket::UnconnectedState;
1051 }
else if (value == WSAEHOSTUNREACH) {
1052 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::HostUnreachableErrorString);
1053 d->socketState = QAbstractSocket::UnconnectedState;
1064 d->setError(QAbstractSocket::SocketTimeoutError,
1065 QNativeSocketEnginePrivate::TimeOutErrorString);
1066 d->hasSetSocketError =
false;
1068 }
else if (state() == QAbstractSocket::ConnectingState || (state() == QAbstractSocket::BoundState && d->socketDescriptor != -1)) {
1069 connectToHost(d->peerAddress, d->peerPort);
1075bool QNativeSocketEngine::waitForReadOrWrite(
bool *readyToRead,
bool *readyToWrite,
1076 bool checkRead,
bool checkWrite,
1077 QDeadlineTimer deadline,
bool *timedOut)
1079 Q_D(QNativeSocketEngine);
1082 QAbstractSocket::UnconnectedState,
false);
1084 int ret = d->nativeSelect(deadline, checkRead, checkWrite, readyToRead, readyToWrite);
1088#if defined (Q_OS_WIN)
1089 if (state() == QAbstractSocket::ConnectingState) {
1090 if (checkWrite && ((readyToWrite && *readyToWrite) || !readyToWrite) && ret > 0) {
1091 setState(QAbstractSocket::ConnectedState);
1092 d_func()->fetchConnectionParameters();
1096 int valueSize =
sizeof(value);
1097 if (::getsockopt(d->socketDescriptor, SOL_SOCKET, SO_ERROR, (
char *) &value, &valueSize) == 0) {
1098 if (value == WSAECONNREFUSED) {
1099 d->setError(QAbstractSocket::ConnectionRefusedError, QNativeSocketEnginePrivate::ConnectionRefusedErrorString);
1100 d->socketState = QAbstractSocket::UnconnectedState;
1102 }
else if (value == WSAETIMEDOUT) {
1103 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::ConnectionTimeOutErrorString);
1104 d->socketState = QAbstractSocket::UnconnectedState;
1106 }
else if (value == WSAEHOSTUNREACH) {
1107 d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::HostUnreachableErrorString);
1108 d->socketState = QAbstractSocket::UnconnectedState;
1118 d->setError(QAbstractSocket::SocketTimeoutError,
1119 QNativeSocketEnginePrivate::TimeOutErrorString);
1120 d->hasSetSocketError =
false;
1122 }
else if (state() == QAbstractSocket::ConnectingState) {
1123 connectToHost(d->peerAddress, d->peerPort);
1303void QNativeSocketEngine::setReadNotificationEnabled(
bool enable)
1305 Q_D(QNativeSocketEngine);
1306 if (d->readNotifier) {
1307 d->readNotifier->setEnabled(enable);
1308 }
else if (enable && d->threadData.loadRelaxed()->hasEventDispatcher()) {
1309 d->readNotifier =
new QReadNotifier(d->socketDescriptor,
this);
1310 d->readNotifier->setEnabled(
true);
1320void QNativeSocketEngine::setWriteNotificationEnabled(
bool enable)
1322 Q_D(QNativeSocketEngine);
1323 if (d->writeNotifier) {
1324 d->writeNotifier->setEnabled(enable);
1325 }
else if (enable && d->threadData.loadRelaxed()->hasEventDispatcher()) {
1326 d->writeNotifier =
new QWriteNotifier(d->socketDescriptor,
this);
1327 d->writeNotifier->setEnabled(
true);
1337void QNativeSocketEngine::setExceptionNotificationEnabled(
bool enable)
1339 Q_D(QNativeSocketEngine);
1340 if (d->exceptNotifier) {
1341 d->exceptNotifier->setEnabled(enable);
1342 }
else if (enable && d->threadData.loadRelaxed()->hasEventDispatcher()) {
1343 d->exceptNotifier =
new QExceptionNotifier(d->socketDescriptor,
this);
1344 d->exceptNotifier->setEnabled(
true);