Skip to content

Commit 0d050d5

Browse files
authored
Add automatic constructors for TCP and UDP transports. (#512)
* Add automatic constructors for TCP and UDP transports. * Add port number argument. Add some documentation comments. Fix tests. * Make datagram test use request/response scheme. * Add helper. * Fix issue with non-zero port setups. Add test. * Fix tests to probe ports. * Attempt to fix MacOS issue. * Add Opt[IpAddress]. Make IPv4 mapping to IPv6 space automatic. * Add tests. * Add stream capabilities. * Fix Linux issues. * Make getTransportFlags() available for all OSes. * Fix one more compilation issue. * Workaround weird compiler bug. * Fix forgotten typed version of constructor. * Make single source for addresses calculation. * Add one more check into tests. * Fix flags not being set in transport constructor. * Fix post-rebase issues with flags not being set. * Address review comments.
1 parent 8e49df1 commit 0d050d5

File tree

5 files changed

+1250
-250
lines changed

5 files changed

+1250
-250
lines changed

chronos/transports/common.nim

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
{.push raises: [].}
1111

1212
import std/[strutils]
13+
import results
1314
import stew/[base10, byteutils]
1415
import ".."/[config, asyncloop, osdefs, oserrno, handles]
1516

@@ -18,7 +19,7 @@ from std/net import Domain, `==`, IpAddress, IpAddressFamily, parseIpAddress,
1819
from std/nativesockets import toInt, `$`
1920

2021
export Domain, `==`, IpAddress, IpAddressFamily, parseIpAddress, SockType,
21-
Protocol, Port, toInt, `$`
22+
Protocol, Port, toInt, `$`, results
2223

2324
const
2425
DefaultStreamBufferSize* = chronosTransportDefaultBufferSize
@@ -29,7 +30,7 @@ type
2930
ServerFlags* = enum
3031
## Server's flags
3132
ReuseAddr, ReusePort, TcpNoDelay, NoAutoRead, GCUserData, FirstPipe,
32-
NoPipeFlash, Broadcast
33+
NoPipeFlash, Broadcast, V4Mapped
3334

3435
DualStackType* {.pure.} = enum
3536
Auto, Enabled, Disabled, Default
@@ -200,6 +201,15 @@ proc `$`*(address: TransportAddress): string =
200201
of AddressFamily.None:
201202
"None"
202203

204+
proc toIpAddress*(address: TransportAddress): IpAddress =
205+
case address.family
206+
of AddressFamily.IPv4:
207+
IpAddress(family: IpAddressFamily.IPv4, address_v4: address.address_v4)
208+
of AddressFamily.IPv6:
209+
IpAddress(family: IpAddressFamily.IPv6, address_v6: address.address_v6)
210+
else:
211+
raiseAssert "IpAddress do not support address family " & $address.family
212+
203213
proc toHex*(address: TransportAddress): string =
204214
## Returns hexadecimal representation of ``address``.
205215
case address.family
@@ -783,3 +793,25 @@ proc setDualstack*(socket: AsyncFD,
783793
else:
784794
? getDomain(socket)
785795
setDualstack(socket, family, flag)
796+
797+
proc getAutoAddress*(port: Port): TransportAddress =
798+
var res =
799+
if isAvailable(AddressFamily.IPv6):
800+
AnyAddress6
801+
else:
802+
AnyAddress
803+
res.port = port
804+
res
805+
806+
proc getAutoAddresses*(
807+
localPort: Port,
808+
remotePort: Port
809+
): tuple[local: TransportAddress, remote: TransportAddress] =
810+
var (local, remote) =
811+
if isAvailable(AddressFamily.IPv6):
812+
(AnyAddress6, AnyAddress6)
813+
else:
814+
(AnyAddress, AnyAddress)
815+
local.port = localPort
816+
remote.port = remotePort
817+
(local, remote)

0 commit comments

Comments
 (0)