diff options
| author | Drahflow <drahflow@gmx.de> | 2014-12-28 16:32:47 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2014-12-28 16:32:47 +0100 |
| commit | e2cfcc8e4b59de8334da380dabf9d5208c5e7f4c (patch) | |
| tree | 3f872919f20fe2e06089696e089ac3d3fe8dc479 /elymas/lib | |
| parent | 0e816c4c2c6f4df7f568b1ba0506354e8a83051c (diff) | |
Supply SO_REUSEADDR (default for buffered servers)
Diffstat (limited to 'elymas/lib')
| -rw-r--r-- | elymas/lib/net/alg/server.ey | 13 | ||||
| -rw-r--r-- | elymas/lib/net/tcp.ey | 23 | ||||
| -rw-r--r-- | elymas/lib/sys/linux.ey | 16 |
3 files changed, 41 insertions, 11 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 diff --git a/elymas/lib/sys/linux.ey b/elymas/lib/sys/linux.ey index d16a483..a155d9a 100644 --- a/elymas/lib/sys/linux.ey +++ b/elymas/lib/sys/linux.ey @@ -245,7 +245,7 @@ # 113 ==:SETREUID # 160 ==:SETRLIMIT # 112 ==:SETSID - # 54 ==:SETSOCKOPT + 54 ==:SETSOCKOPT # 164 ==:SETTIMEOFDAY # 105 ==:SETUID # 188 ==:SETXATTR @@ -662,6 +662,20 @@ { 0 0 0 READ } /read defStdSyscall + < + 1 ==:SOLSOCKET + + # TODO: support more options + 2 ==:SOREUSEADDR + + # 0 -> socket fd + # 1 -> turn it on (1) or off (0) + # 0 <- raw return value + { ==fd ==value + fd SOLSOCKET SOREUSEADDR "" value <-u32 4 0 SETSOCKOPT sys .asm .syscall =errno + } /reuseAddr deffd + > /setsockopt defvd + # 0 <- raw return value # 1 <- returned status { ==options ==pid |
