diff --git a/Net/include/Poco/Net/WebSocket.h b/Net/include/Poco/Net/WebSocket.h index 8034ca248..d0af70f32 100644 --- a/Net/include/Poco/Net/WebSocket.h +++ b/Net/include/Poco/Net/WebSocket.h @@ -54,6 +54,10 @@ class Net_API WebSocket: public StreamSocket /// mode, by calling setBlocking(false). /// Please refer to the sendFrame() and receiveFrame() documentation /// for non-blocking behavior. + /// + /// TCP_NODELAY is automatically enabled on the underlying socket + /// to prevent delays from Nagle's algorithm when sending small + /// WebSocket frames. { public: enum Mode diff --git a/Net/src/WebSocketImpl.cpp b/Net/src/WebSocketImpl.cpp index 64873cd28..795c6c706 100644 --- a/Net/src/WebSocketImpl.cpp +++ b/Net/src/WebSocketImpl.cpp @@ -18,6 +18,7 @@ #include "Poco/Net/NetException.h" #include "Poco/Net/WebSocket.h" #include "Poco/Net/HTTPSession.h" +#include "Poco/Net/SocketAddress.h" #include "Poco/Buffer.h" #include "Poco/BinaryWriter.h" #include "Poco/BinaryReader.h" @@ -42,6 +43,21 @@ WebSocketImpl::WebSocketImpl(StreamSocketImpl* pStreamSocketImpl, HTTPSession& s poco_check_ptr(pStreamSocketImpl); _pStreamSocketImpl->duplicate(); session.drainBuffer(_buffer); + // Enable TCP_NODELAY to prevent delays caused by Nagle's algorithm + // for small WebSocket frames. Skip for Unix domain sockets. + try + { + if (_pStreamSocketImpl->address().family() != SocketAddress::UNIX_LOCAL) + _pStreamSocketImpl->setNoDelay(true); + } + catch (NetException&) + { + // Ignore - socket errors (e.g., not connected or doesn't support TCP options) + } + catch (Poco::Exception&) + { + // Ignore - other configuration errors (IOException, InvalidArgumentException, etc.) + } }