diff options
author | Federico Ceratto <federico.ceratto@gmail.com> | 2015-12-15 23:50:28 +0000 |
---|---|---|
committer | Federico Ceratto <federico.ceratto@gmail.com> | 2015-12-16 00:42:22 +0000 |
commit | e174aa1dbccd6c5c5b6a05543da41158c3e2c374 (patch) | |
tree | e76d99c2087bc7ae6f2435abcbfc7cc16a74c6ce /lib | |
parent | 31ebb11d73f7ad58afc497f20d9723503b83ca75 (diff) | |
download | Nim-e174aa1dbccd6c5c5b6a05543da41158c3e2c374.tar.gz |
Add SO_REUSEPORT support
Diffstat (limited to 'lib')
-rw-r--r-- | lib/posix/posix.nim | 2 | ||||
-rw-r--r-- | lib/pure/asynchttpserver.nim | 6 | ||||
-rw-r--r-- | lib/pure/nativesockets.nim | 2 | ||||
-rw-r--r-- | lib/pure/net.nim | 3 |
4 files changed, 10 insertions, 3 deletions
diff --git a/lib/posix/posix.nim b/lib/posix/posix.nim index 5f1dfcfcd..c3d563419 100644 --- a/lib/posix/posix.nim +++ b/lib/posix/posix.nim @@ -1566,6 +1566,8 @@ var ## Receive timeout. SO_REUSEADDR* {.importc, header: "<sys/socket.h>".}: cint ## Reuse of local addresses is supported. + SO_REUSEPORT* {.importc, header: "<sys/socket.h>".}: cint + ## Multiple binding: load balancing on incoming TCP connections or UDP packets. (Requires Linux kernel > 3.9) SO_SNDBUF* {.importc, header: "<sys/socket.h>".}: cint ## Send buffer size. SO_SNDLOWAT* {.importc, header: "<sys/socket.h>".}: cint diff --git a/lib/pure/asynchttpserver.nim b/lib/pure/asynchttpserver.nim index 590b52c1a..865b14c75 100644 --- a/lib/pure/asynchttpserver.nim +++ b/lib/pure/asynchttpserver.nim @@ -39,6 +39,7 @@ type AsyncHttpServer* = ref object socket: AsyncSocket reuseAddr: bool + reusePort: bool HttpCode* = enum Http100 = "100 Continue", @@ -99,10 +100,11 @@ proc `==`*(protocol: tuple[orig: string, major, minor: int], of HttpVer10: 0 result = protocol.major == major and protocol.minor == minor -proc newAsyncHttpServer*(reuseAddr = true): AsyncHttpServer = +proc newAsyncHttpServer*(reuseAddr = true, reusePort = false): AsyncHttpServer = ## Creates a new ``AsyncHttpServer`` instance. new result result.reuseAddr = reuseAddr + result.reusePort = reusePort proc addHeaders(msg: var string, headers: StringTableRef) = for k, v in headers: @@ -264,6 +266,8 @@ proc serve*(server: AsyncHttpServer, port: Port, server.socket = newAsyncSocket() if server.reuseAddr: server.socket.setSockOpt(OptReuseAddr, true) + if server.reusePort: + server.socket.setSockOpt(OptReusePort, true) server.socket.bindAddr(port, address) server.socket.listen() diff --git a/lib/pure/nativesockets.nim b/lib/pure/nativesockets.nim index 8a7780570..37e3773c5 100644 --- a/lib/pure/nativesockets.nim +++ b/lib/pure/nativesockets.nim @@ -38,7 +38,7 @@ export SOL_SOCKET, SOMAXCONN, SO_ACCEPTCONN, SO_BROADCAST, SO_DEBUG, SO_DONTROUTE, - SO_KEEPALIVE, SO_OOBINLINE, SO_REUSEADDR, + SO_KEEPALIVE, SO_OOBINLINE, SO_REUSEADDR, SO_REUSEPORT, MSG_PEEK when defined(macosx) and not defined(nimdoc): diff --git a/lib/pure/net.nim b/lib/pure/net.nim index d1016011e..1243201ab 100644 --- a/lib/pure/net.nim +++ b/lib/pure/net.nim @@ -72,7 +72,7 @@ type SOBool* = enum ## Boolean socket options. OptAcceptConn, OptBroadcast, OptDebug, OptDontRoute, OptKeepAlive, - OptOOBInline, OptReuseAddr + OptOOBInline, OptReuseAddr, OptReusePort ReadLineResult* = enum ## result for readLineAsync ReadFullLine, ReadPartialLine, ReadDisconnected, ReadNone @@ -523,6 +523,7 @@ proc toCInt*(opt: SOBool): cint = of OptKeepAlive: SO_KEEPALIVE of OptOOBInline: SO_OOBINLINE of OptReuseAddr: SO_REUSEADDR + of OptReusePort: SO_REUSEPORT proc getSockOpt*(socket: Socket, opt: SOBool, level = SOL_SOCKET): bool {. tags: [ReadIOEffect].} = |