aboutsummaryrefslogtreecommitdiff
path: root/elymas/lib/net
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2014-12-28 16:32:47 +0100
committerDrahflow <drahflow@gmx.de>2014-12-28 16:32:47 +0100
commite2cfcc8e4b59de8334da380dabf9d5208c5e7f4c (patch)
tree3f872919f20fe2e06089696e089ac3d3fe8dc479 /elymas/lib/net
parent0e816c4c2c6f4df7f568b1ba0506354e8a83051c (diff)
Supply SO_REUSEADDR (default for buffered servers)
Diffstat (limited to 'elymas/lib/net')
-rw-r--r--elymas/lib/net/alg/server.ey13
-rw-r--r--elymas/lib/net/tcp.ey23
2 files changed, 26 insertions, 10 deletions
diff --git a/elymas/lib/net/alg/server.ey b/elymas/lib/net/alg/server.ey
index 2b291a7..882b46f 100644
--- a/elymas/lib/net/alg/server.ey
+++ b/elymas/lib/net/alg/server.ey
@@ -4,11 +4,16 @@
{ ==err ==actions _ 0 lt { actions err ??? } rep } "+???" deffd
{ <
+ sys .linux "+" via +epoll "++" via
+ sys .asm "+!" via
+ net .tcp "+:" via
+
<
{ 1 } /running deffst
{ 1000000 } /interval deffst
{ "unconfigured accept (of epollServer)" die } /accept deffst
{ "unconfigured port (of epollServer)" die } /port deffst
+ { 1 -01 +setsockopt .reuseAddr +??io.net.setsockopt -- } /reuseAddr deffst
{ = }' /set deffst
{ scope keys }' /setters deffst
@@ -19,14 +24,12 @@
{ deffst }' ::installSetters
- sys .linux "+" via +epoll "++" via
- sys .asm "+!" via
- net .tcp "+:" via
-
< > ==:noHandler
{
- ::port +:listenFd ==listenFd
+ ::port { # ==s
+ ::reuseAddr
+ } +:listenOptFd ==listenFd
[ ] ==allEventHandlers
{ ==fd ==handler
diff --git a/elymas/lib/net/tcp.ey b/elymas/lib/net/tcp.ey
index 7fcc194..18b0a3e 100644
--- a/elymas/lib/net/tcp.ey
+++ b/elymas/lib/net/tcp.ey
@@ -19,6 +19,12 @@
0 <-un64
} /sockaddrIpv4 deffd
+ # 0 <- new tcp socket fd
+ {
+ +AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket
+ } _ /socketFd deffd
+ /socket deffd
+
# 0 -> "host:port"
# 0 <- connected socket fd
{ "^([^:]+):(\\d+)$" regex not { "host:port expected" die } rep
@@ -36,16 +42,23 @@
connectFd sys .fdToFile
} /connect deffd
- # 0 -> port
+ # 0 -> function to execute before bind ({ ==socket ... })
+ # 1 -> port
# 0 <- listening socket fd
- { # ==port
+ { =*opts # ==port
0 <=un32 -01 sockaddrIpv4
- +AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket _ ==s
+ +AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket -000 ==s
+ opts
-01 +bind +??io.net.bind --
s 256 +listen +??io.net.listen --
s
- } _ /listenFd deffd
- /listen deffd
+ } _ /listenOptFd deffd
+ /listenOpt deffd
+
+ # 0 -> port
+ # 0 <- listening socket fd
+ { { } listenOptFd } _ /listenFd deffd
+ /listen deffd
# 0 -> listening socket fd
# 0 <- newly accepted connection fd