blob: 7fcc194ade423c23bc1763345538af46892abe68 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
# Provide nice ways to do TCP/IP networking
<
{ ==err _ 0 lt { err ?? } rep } "+??" deffd
{ ==err ==actions _ 0 lt { actions err ??? } rep } "+???" deffd
bin .scan "->" via
bin .print "<-" via
bin .produce "<=" via
sys .linux "+" via
# 0 -> port
# 1 -> host (as network byte ordered string)
# 0 <- string representing the sockaddr_in
{ ==port ==host
+AFINET <=u16
port <-un16
host cat
0 <-un64
} /sockaddrIpv4 deffd
# 0 -> "host:port"
# 0 <- connected socket fd
{ "^([^:]+):(\\d+)$" regex not { "host:port expected" die } rep
net .dns .resolveIpv4
-01 txt .consume .u
sockaddrIpv4
+AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket _ ==s
-01 +connect +??io.net.connect --
s
} /connectFd deffd
# 0 -> "host:port"
# 0 <- connected socket as file
{
connectFd sys .fdToFile
} /connect deffd
# 0 -> port
# 0 <- listening socket fd
{ # ==port
0 <=un32 -01 sockaddrIpv4
+AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket _ ==s
-01 +bind +??io.net.bind --
s 256 +listen +??io.net.listen --
s
} _ /listenFd deffd
/listen deffd
# 0 -> listening socket fd
# 0 <- newly accepted connection fd
{ # ==fd
+accept +??io.net.accept
} /acceptFd deffd
# 0 -> listening socket fd
# 0 <- newly accepted connection as file
{ # ==fd
acceptFd sys .fdToFile
} /accept deffd
> /tcp net .defv
# vim: syn=elymas
|