From bdd65af1a43c2ff90c3e9ae844f286f282a838ac Mon Sep 17 00:00:00 2001 From: Rick Dicaire Date: Sat, 7 Feb 2026 13:55:31 -0500 Subject: [PATCH 1/5] Correct data size for IPV6_TCLASS --- src/socket.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/socket.cpp b/src/socket.cpp index e2de7313e6..22d01cc6a6 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -118,8 +118,8 @@ void CSocket::Init ( const quint16 iNewPortNumber, const quint16 iNewQosNumber, setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_V6ONLY, (const char*) &no, sizeof ( no ) ); // set the QoS - const char tos = (char) iQosNumber; // Quality of Service - setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof ( tos ) ); + const int tos = (int) iQosNumber; // Quality of Service + setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_TCLASS, (const char*) &tos, sizeof ( tos ) ); UdpSocketAddr.sa6.sin6_family = AF_INET6; UdpSocketAddr.sa6.sin6_addr = in6addr_any; From e39af2d0a2b078a67102ea947b8191d0a7922d21 Mon Sep 17 00:00:00 2001 From: Tony Mountifield Date: Sun, 8 Feb 2026 22:02:19 +0000 Subject: [PATCH 2/5] Add error checking for setsockopt() --- src/socket.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/socket.cpp b/src/socket.cpp index 22d01cc6a6..aa452fffbd 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -115,11 +115,17 @@ void CSocket::Init ( const quint16 iNewPortNumber, const quint16 iNewQosNumber, // The IPV6_V6ONLY socket option must be false in order for the socket to listen on both protocols. // On Linux it's false by default on most (all?) distros, but on Windows it is true by default const uint8_t no = 0; - setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_V6ONLY, (const char*) &no, sizeof ( no ) ); + if ( setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_V6ONLY, (const char*) &no, sizeof ( no ) ) == -1 ) + { + throw CGenErr ( "setsockopt for IPV6_V6ONLY failed", "Network Error" ); + } // set the QoS const int tos = (int) iQosNumber; // Quality of Service - setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_TCLASS, (const char*) &tos, sizeof ( tos ) ); + if ( setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_TCLASS, (const char*) &tos, sizeof ( tos ) ) == -1 ) + { + throw CGenErr ( "setsockopt for IPV6_TCLASS failed", "Network Error" ); + } UdpSocketAddr.sa6.sin6_family = AF_INET6; UdpSocketAddr.sa6.sin6_addr = in6addr_any; @@ -148,7 +154,10 @@ void CSocket::Init ( const quint16 iNewPortNumber, const quint16 iNewQosNumber, // set the QoS const char tos = (char) iQosNumber; // Quality of Service - setsockopt ( UdpSocket, IPPROTO_IP, IP_TOS, &tos, sizeof ( tos ) ); + if ( setsockopt ( UdpSocket, IPPROTO_IP, IP_TOS, &tos, sizeof ( tos ) ) == -1 ) + { + throw CGenErr ( "setsockopt for IP_TOS failed", "Network Error" ); + } // preinitialize socket in address (only the port number is missing) UdpSocketAddr.sa4.sin_family = AF_INET; From a64794138f54c8abca8baa0152ed2a704a0c9ee7 Mon Sep 17 00:00:00 2001 From: Tony Mountifield Date: Sun, 8 Feb 2026 22:23:36 +0000 Subject: [PATCH 3/5] Correct data size for IPV6_V6ONLY --- src/socket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/socket.cpp b/src/socket.cpp index aa452fffbd..81d252ffbe 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -114,7 +114,7 @@ void CSocket::Init ( const quint16 iNewPortNumber, const quint16 iNewQosNumber, // The IPV6_V6ONLY socket option must be false in order for the socket to listen on both protocols. // On Linux it's false by default on most (all?) distros, but on Windows it is true by default - const uint8_t no = 0; + const int no = 0; if ( setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_V6ONLY, (const char*) &no, sizeof ( no ) ) == -1 ) { throw CGenErr ( "setsockopt for IPV6_V6ONLY failed", "Network Error" ); From 6de1d023b1bc62d8a6f418e596b243f598958db6 Mon Sep 17 00:00:00 2001 From: Tony Mountifield Date: Sun, 8 Feb 2026 22:48:29 +0000 Subject: [PATCH 4/5] Also need setsockopt() for IPv4 on a dual-proto socket --- src/socket.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/socket.cpp b/src/socket.cpp index 81d252ffbe..02d1d5d8cb 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -127,6 +127,12 @@ void CSocket::Init ( const quint16 iNewPortNumber, const quint16 iNewQosNumber, throw CGenErr ( "setsockopt for IPV6_TCLASS failed", "Network Error" ); } + // set the QoS for IPv4 as well, as this is a dual-protocol socket + if ( setsockopt ( UdpSocket, IPPROTO_IP, IP_TOS, (const char*) &tos, sizeof ( tos ) ) == -1 ) + { + throw CGenErr ( "setsockopt for IP_TOS failed", "Network Error" ); + } + UdpSocketAddr.sa6.sin6_family = AF_INET6; UdpSocketAddr.sa6.sin6_addr = in6addr_any; UdpSocketAddrLen = sizeof ( UdpSocketAddr.sa6 ); @@ -153,8 +159,8 @@ void CSocket::Init ( const quint16 iNewPortNumber, const quint16 iNewQosNumber, } // set the QoS - const char tos = (char) iQosNumber; // Quality of Service - if ( setsockopt ( UdpSocket, IPPROTO_IP, IP_TOS, &tos, sizeof ( tos ) ) == -1 ) + const int tos = (int) iQosNumber; // Quality of Service + if ( setsockopt ( UdpSocket, IPPROTO_IP, IP_TOS, (const char*) &tos, sizeof ( tos ) ) == -1 ) { throw CGenErr ( "setsockopt for IP_TOS failed", "Network Error" ); } From b5a38db56b4064c5f38c43bffb55e8db0ebd800a Mon Sep 17 00:00:00 2001 From: Tony Mountifield Date: Mon, 9 Feb 2026 18:06:08 +0000 Subject: [PATCH 5/5] Remove socket options that do not work on Windows and Apple --- src/socket.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/socket.cpp b/src/socket.cpp index 02d1d5d8cb..94323c390b 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -122,16 +122,20 @@ void CSocket::Init ( const quint16 iNewPortNumber, const quint16 iNewQosNumber, // set the QoS const int tos = (int) iQosNumber; // Quality of Service +#if !defined( Q_OS_WIN ) if ( setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_TCLASS, (const char*) &tos, sizeof ( tos ) ) == -1 ) { throw CGenErr ( "setsockopt for IPV6_TCLASS failed", "Network Error" ); } +#endif +#if !defined( Q_OS_DARWIN ) // set the QoS for IPv4 as well, as this is a dual-protocol socket if ( setsockopt ( UdpSocket, IPPROTO_IP, IP_TOS, (const char*) &tos, sizeof ( tos ) ) == -1 ) { throw CGenErr ( "setsockopt for IP_TOS failed", "Network Error" ); } +#endif UdpSocketAddr.sa6.sin6_family = AF_INET6; UdpSocketAddr.sa6.sin6_addr = in6addr_any;