From fa7c02e9f5e53afba2f867fc3b77ec8a59d62528 Mon Sep 17 00:00:00 2001 From: Ian Craggs Date: Thu, 12 Feb 2026 15:17:43 +0000 Subject: [PATCH] Set TCP_NODELAY by default, CMake option to not use it #530 --- CMakeLists.txt | 5 +++++ src/Socket.c | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b8d15f8..d244484c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,7 @@ option(PAHO_ENABLE_TESTING "Build tests and run" TRUE) option(PAHO_ENABLE_CPACK "Enable CPack" TRUE) option(PAHO_HIGH_PERFORMANCE "Disable tracing and heap tracking" FALSE) option(PAHO_USE_SELECT "Revert to select system call instead of poll" FALSE) +option(PAHO_NO_TCP_NODELAY "Don't disable Nagle's algorithm on TCP sockets" FALSE) if(NOT WIN32) option(PAHO_WITH_UNIX_SOCKETS "Flag that defines whether to enable Unix-domain sockets" FALSE) @@ -85,6 +86,10 @@ if(PAHO_WITH_LIBUUID) add_definitions(-DUSE_LIBUUID=1) endif() +if(PAHO_NO_TCP_NODELAY) + add_definitions(-DNO_TCP_NODELAY=1) +endif() + if(NOT PAHO_BUILD_SHARED AND NOT PAHO_BUILD_STATIC) message(FATAL_ERROR "You must set either PAHO_BUILD_SHARED, PAHO_BUILD_STATIC, or both") endif() diff --git a/src/Socket.c b/src/Socket.c index 4909c6ab..d2ebfdab 100644 --- a/src/Socket.c +++ b/src/Socket.c @@ -1462,6 +1462,15 @@ int Socket_new(const char* addr, size_t addr_len, int port, SOCKET* sock) if (setsockopt(*sock, SOL_SOCKET, SO_NOSIGPIPE, (void*)&opt, sizeof(opt)) != 0) Log(LOG_ERROR, -1, "Could not set SO_NOSIGPIPE for socket %d", *sock); #endif +#if !defined(NO_TCP_NODELAY) + { + int opt = 1; + socklen_t opt_size = sizeof(opt); + + if (setsockopt(*sock, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)) != 0) + Log(LOG_ERROR, -1, "Could not set TCP_NODELAY for socket %d", *sock); + } +#endif /*#define SMALL_TCP_BUFFER_TESTING This section sets the TCP send buffer to a small amount to provoke TCPSOCKET_INTERRUPTED return codes from send, for testing only!