summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp12
-rw-r--r--tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp36
2 files changed, 43 insertions, 5 deletions
diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index d7bbe7eb86..93a470c77f 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -427,10 +427,14 @@ int QNativeSocketEnginePrivate::option(QNativeSocketEngine::SocketOption opt) co
break;
}
- int v = -1;
+#if Q_BYTE_ORDER != Q_LITTLE_ENDIAN
+#error code assumes windows is little endian
+#endif
+ int v = 0; //note: windows doesn't write to all bytes if the option type is smaller than int
QT_SOCKOPTLEN_T len = sizeof(v);
- if (getsockopt(socketDescriptor, level, n, (char *) &v, &len) != -1)
+ if (getsockopt(socketDescriptor, level, n, (char *) &v, &len) == 0)
return v;
+ WS_ERROR_DEBUG(WSAGetLastError());
return -1;
}
@@ -563,12 +567,10 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
#if defined (IPV6_V6ONLY)
// determine if local address is dual mode
DWORD ipv6only = 0;
- int optlen = sizeof(ipv6only);
+ QT_SOCKOPTLEN_T optlen = sizeof(ipv6only);
if (localAddress == QHostAddress::AnyIPv6
&& QSysInfo::windowsVersion() >= QSysInfo::WV_6_0
&& !getsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&ipv6only, &optlen )) {
- if (optlen != sizeof(ipv6only))
- qWarning("unexpected size of IPV6_V6ONLY socket option");
if (!ipv6only) {
socketProtocol = QAbstractSocket::AnyIPProtocol;
localAddress = QHostAddress::Any;
diff --git a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
index 2c2b551257..8b65c312bc 100644
--- a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
+++ b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
@@ -201,6 +201,8 @@ private slots:
void qtbug14268_peek();
+ void setSocketOption();
+
protected slots:
void nonBlockingIMAP_hostFound();
@@ -2699,7 +2701,41 @@ void tst_QTcpSocket::qtbug14268_peek()
QVERIFY(incoming->read(128*1024) == QByteArray("abc\ndef\nghi\n"));
}
+void tst_QTcpSocket::setSocketOption()
+{
+ QFETCH_GLOBAL(bool, setProxy);
+ if (setProxy)
+ return;
+
+ SocketPair socketPair;
+ QVERIFY(socketPair.create());
+ QTcpSocket *outgoing = socketPair.endPoints[0];
+ QTcpSocket *incoming = socketPair.endPoints[1];
+
+ QVERIFY(incoming->state() == QTcpSocket::ConnectedState);
+ QVERIFY(outgoing->state() == QTcpSocket::ConnectedState);
+
+ outgoing->setSocketOption(QAbstractSocket::LowDelayOption, true);
+ QVariant v = outgoing->socketOption(QAbstractSocket::LowDelayOption);
+ QVERIFY(v.isValid() && v.toBool());
+ outgoing->setSocketOption(QAbstractSocket::KeepAliveOption, true);
+ v = outgoing->socketOption(QAbstractSocket::KeepAliveOption);
+ QVERIFY(v.isValid() && v.toBool());
+ outgoing->setSocketOption(QAbstractSocket::LowDelayOption, false);
+ v = outgoing->socketOption(QAbstractSocket::LowDelayOption);
+ QVERIFY(v.isValid() && !v.toBool());
+ outgoing->setSocketOption(QAbstractSocket::KeepAliveOption, false);
+ v = outgoing->socketOption(QAbstractSocket::KeepAliveOption);
+ QVERIFY(v.isValid() && !v.toBool());
+
+#ifdef Q_OS_WIN
+ QEXPECT_FAIL("", "QTBUG-23323", Abort);
+#endif
+ outgoing->setSocketOption(QAbstractSocket::TypeOfServiceOption, 32); //high priority
+ v = outgoing->socketOption(QAbstractSocket::TypeOfServiceOption);
+ QVERIFY(v.isValid() && v.toInt() == 32);
+}
QTEST_MAIN(tst_QTcpSocket)
#include "tst_qtcpsocket.moc"