# 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 # TODO: use this in the code below (and test) # 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 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 -> function to execute before bind ({ ==socket ... }) # 1 -> port # 0 <- listening socket fd { =*opts # ==port 0 <=un32 -01 sockaddrIpv4 +AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket -000 ==s opts -01 +bind +??io.net.bind -- s 256 +listen +??io.net.listen -- s } _ /listenOptFd deffd /listenOpt deffd # 0 -> port # 0 <- listening socket fd { { } listenOptFd } _ /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