summaryrefslogtreecommitdiffstats
path: root/src/network/socket/qnativesocketengine_unix.cpp
diff options
context:
space:
mode:
authorGleb Popov <arrowd@FreeBSD.org>2025-10-07 10:53:18 +0300
committerThiago Macieira <thiago.macieira@intel.com>2025-10-10 10:25:31 +0000
commita395c091a56781352113670b72ba619367486e7e (patch)
treed763925a21c542a9fd2623c530a03776f93809b2 /src/network/socket/qnativesocketengine_unix.cpp
parent8e06365bee31ef5a1980b7b24d1564e3d769cfc7 (diff)
Teach QNativeSocketEnginePrivate::fetchConnectionParameters() about SOCK_SEQPACKET
Pick-to: 6.10 Change-Id: I4136ef3b4c198e3bd155884bde53171bd34959e4 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/network/socket/qnativesocketengine_unix.cpp')
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index b5fbb5c2e00..bcd9aecdea9 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -1244,6 +1244,7 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
QT_SOCKOPTLEN_T valueSize = sizeof(int);
if (::getsockopt(socketDescriptor, SOL_SOCKET, SO_TYPE, &value, &valueSize) == 0) {
if (value == SOCK_STREAM) {
+ socketType = QAbstractSocket::TcpSocket;
#ifndef QT_NO_SCTP
if (option(QNativeSocketEngine::MaxStreamsSocketOption) != -1) {
socketType = QAbstractSocket::SctpSocket;
@@ -1266,17 +1267,23 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters()
return false;
}
}
- } else {
- socketType = QAbstractSocket::TcpSocket;
}
-#else
- socketType = QAbstractSocket::TcpSocket;
+#endif
+ } else if (value == SOCK_DGRAM) {
+ socketType = QAbstractSocket::UdpSocket;
+#ifdef SOCK_SEQPACKET
+ } else if (value == SOCK_SEQPACKET) {
+ // We approximate the SEQPACKET socket type to TCP, because
+ // this enum is actually used to determine if the socket type has
+ // a notion of connection. SOCK_DGRAM are connectionless, while
+ // SOCK_STREAM and SOCK_SEQPACKET are connection-orientired.
+ // This mapping is still suboptimal, because it is possible to send
+ // a 0-byte packet via SEQPACKET socket and Qt will treat it as
+ // a disconnect.
+ socketType = QAbstractSocket::TcpSocket;
#endif
} else {
- if (value == SOCK_DGRAM)
- socketType = QAbstractSocket::UdpSocket;
- else
- socketType = QAbstractSocket::UnknownSocketType;
+ socketType = QAbstractSocket::UnknownSocketType;
}
}
#if defined (QNATIVESOCKETENGINE_DEBUG)