diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-05-29 22:21:56 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-05-29 22:21:56 +0200 |
commit | 380524caa8f3fe63fa091755df2c101fd9a5d6d9 (patch) | |
tree | 91d353be9dc8860e221ca501f156654abd2e25d6 /lib | |
parent | 552b13efe4d65c2381d74d4fcaf9237a8730db1c (diff) | |
parent | e174aa1dbccd6c5c5b6a05543da41158c3e2c374 (diff) | |
download | Nim-380524caa8f3fe63fa091755df2c101fd9a5d6d9.tar.gz |
Merge pull request #3648 from FedericoCeratto/reuse_port
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 19b068b60..f79e6491e 100644 --- a/lib/posix/posix.nim +++ b/lib/posix/posix.nim @@ -1575,6 +1575,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 043d6d80a..68ab7742b 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 5de6667dd..195b58832 100644 --- a/lib/pure/net.nim +++ b/lib/pure/net.nim @@ -129,7 +129,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 @@ -579,6 +579,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].} = |