mirror of
https://github.com/pocoproject/poco.git
synced 2026-01-02 10:43:22 +01:00
Fix WebSocket sendFrame delay by enabling TCP_NODELAY (#5077)
* Initial plan * Fix WebSocket sendFrame delay by enabling TCP_NODELAY - Enable TCP_NODELAY in WebSocketImpl constructor to prevent Nagle's algorithm from buffering small WebSocket frames - Add check to skip TCP_NODELAY for Unix domain sockets - Add documentation about TCP_NODELAY behavior to WebSocket class - Tested with existing WebSocket test suite - all tests pass Co-authored-by: aleks-f <2429093+aleks-f@users.noreply.github.com> * Address code review feedback - Avoid unnecessary SocketAddress object construction by calling family() directly - Use specific exception type (Poco::Exception) instead of catch-all Co-authored-by: aleks-f <2429093+aleks-f@users.noreply.github.com> * Refine exception handling for TCP_NODELAY configuration - Catch specific exception types (NetException, IOException, InvalidArgumentException) instead of broad Poco::Exception - Improve error handling comments for clarity Co-authored-by: aleks-f <2429093+aleks-f@users.noreply.github.com> * Consolidate exception handling for better maintainability - Combine catch blocks since all exceptions are handled identically - Improve code clarity with more descriptive comments Co-authored-by: aleks-f <2429093+aleks-f@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: aleks-f <2429093+aleks-f@users.noreply.github.com>
This commit is contained in:
@@ -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.)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user