diff --git a/src/NetworkConnection.cpp b/src/NetworkConnection.cpp index 743f399b17..b2b741eb6d 100644 --- a/src/NetworkConnection.cpp +++ b/src/NetworkConnection.cpp @@ -32,6 +32,9 @@ NetworkConnection::NetworkConnection(std::unique_ptr stream, m_proto_rev = 0x0300; m_state = static_cast(kCreated); m_last_update = 0; + + // turn off Nagle algorithm; we bundle packets for transmission + m_stream->setNoDelay(); } NetworkConnection::~NetworkConnection() { Stop(); } diff --git a/src/tcpsockets/NetworkStream.h b/src/tcpsockets/NetworkStream.h index 3803796586..63aedb4f2f 100644 --- a/src/tcpsockets/NetworkStream.h +++ b/src/tcpsockets/NetworkStream.h @@ -30,6 +30,7 @@ class NetworkStream { virtual llvm::StringRef getPeerIP() const = 0; virtual int getPeerPort() const = 0; + virtual void setNoDelay() = 0; NetworkStream(const NetworkStream&) = delete; NetworkStream& operator=(const NetworkStream&) = delete; diff --git a/src/tcpsockets/TCPStream.cpp b/src/tcpsockets/TCPStream.cpp index 2fcee36da3..3149be6f55 100644 --- a/src/tcpsockets/TCPStream.cpp +++ b/src/tcpsockets/TCPStream.cpp @@ -27,6 +27,7 @@ #include #else #include +#include #include #endif @@ -136,6 +137,11 @@ llvm::StringRef TCPStream::getPeerIP() const { return m_peerIP; } int TCPStream::getPeerPort() const { return m_peerPort; } +void TCPStream::setNoDelay() { + int optval = 1; + setsockopt(m_sd, IPPROTO_TCP, TCP_NODELAY, (char*)&optval, sizeof optval); +} + bool TCPStream::WaitForReadEvent(int timeout) { fd_set sdset; struct timeval tv; diff --git a/src/tcpsockets/TCPStream.h b/src/tcpsockets/TCPStream.h index a64df3ef6a..21ef6fdbed 100644 --- a/src/tcpsockets/TCPStream.h +++ b/src/tcpsockets/TCPStream.h @@ -53,6 +53,7 @@ class TCPStream : public NetworkStream { llvm::StringRef getPeerIP() const override; int getPeerPort() const override; + void setNoDelay() override; TCPStream(const TCPStream& stream) = delete; TCPStream& operator=(const TCPStream&) = delete;