Enable TCP client to enable TCP_NODELAY (#340)

* Enable TCP client to enable TCP_NODELAY

* add missing return

* fix
This commit is contained in:
Tanguy 2023-01-23 10:18:12 +01:00 committed by GitHub
parent 40143f8798
commit 3d532b6d4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -45,7 +45,7 @@ type
WinServerPipe,
# This is internal flag which used to differentiate between server pipe
# handle and client pipe handle.
WinNoPipeFlash
WinNoPipeFlash,
# By default `AddressFamily.Unix` transports in Windows are using
# `FlushFileBuffers()` when transport closing.
# This flag disables usage of `FlushFileBuffers()` on `AddressFamily.Unix`
@ -55,6 +55,8 @@ type
# get stuck on transport `close()`.
# Please use this flag only if you are making both client and server in
# the same thread.
TcpNoDelay
StreamTransportTracker* = ref object of TrackerBase
opened*: int64
@ -1490,7 +1492,8 @@ else:
proc connect*(address: TransportAddress,
bufferSize = DefaultStreamBufferSize,
child: StreamTransport = nil): Future[StreamTransport] =
child: StreamTransport = nil,
flags: set[TransportFlags] = {}): Future[StreamTransport] =
## Open new connection to remote peer with address ``address`` and create
## new transport object ``StreamTransport`` for established connection.
## ``bufferSize`` - size of internal buffer for transport.
@ -1520,6 +1523,16 @@ else:
retFuture.fail(getTransportOsError(err))
return retFuture
if address.family in {AddressFamily.IPv4, AddressFamily.IPv6}:
if TransportFlags.TcpNoDelay in flags:
if not(setSockOpt(sock, handles.IPPROTO_TCP,
handles.TCP_NODELAY, 1)):
let err = osLastError()
sock.closeSocket()
retFuture.fail(getTransportOsError(err))
return retFuture
proc continuation(udata: pointer) =
if not(retFuture.finished()):
var err = 0