lib/min_net.nim
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
import net, nativesockets, strutils
import
../core/parser,
../core/value,
../core/interpreter,
../core/utils
# Time
proc toSocket(q: MinValue): Socket =
return cast[Socket](q.obj)
proc net_module*(i: In)=
let def = i.define()
def.symbol("socket") do (i: In):
let vals = i.expect "dict"
var q = vals[0]
var
domain = AF_INET
sockettype = SOCK_STREAM
protocol = IPPROTO_TCP
sDomain = "ipv4"
sSockType = "stream"
sProtocol = "tcp"
if q.dhas("domain".newVal):
sDomain = q.dget("domain".newVal).getString
if (sDomain == "unix"):
domain = AF_UNIX
elif (sDomain == "ipv6"):
domain = AF_INET6
if q.dhas("type".newVal):
sSockType = q.dget("type".newVal).getString
if (sSockType == "dgram"):
sockettype = SOCK_DGRAM
elif (sSockType == "raw"):
sockettype = SOCK_RAW
elif (sSockType == "seqpacket"):
sockettype = SOCK_SEQPACKET
if q.dhas("protocol".newVal):
sProtocol = q.dget("protocol".newVal).getstring
if (sProtocol == "udp"):
protocol = IPPROTO_UDP
elif (sProtocol == "ipv4"):
protocol = IPPROTO_IP
elif (sProtocol == "ipv6"):
protocol = IPPROTO_IPV6
elif (sProtocol == "raw"):
protocol = IPPROTO_RAW
elif (sProtocol == "icmp"):
protocol = IPPROTO_ICMP
var socket = newSocket(domain, sockettype, protocol)
var skt = newSeq[MinValue](0).newVal(i.scope)
skt = i.dset(skt, "domain".newVal, sDomain.newVal)
skt = i.dset(skt, "type".newVal, sSockType.newVal)
skt = i.dset(skt, "protocol".newVal, sProtocol.newVal)
skt.objType = "socket"
skt.obj = socket[].addr
i.push skt
def.symbol("close") do (i: In):
let vals = i.expect("dict:socket")
vals[0].toSocket.close()
def.symbol("listen") do (i: In):
let vals = i.expect("dict", "dict:socket")
let params = vals[0]
var skt = vals[1]
var socket = skt.toSocket
var address = "0.0.0.0"
var port: BiggestInt = 80
if params.dhas("address".newVal):
address = params.dget("address".newVal).getString
if params.dhas("port".newVal):
port = params.dget("port".newVal).intVal
socket.bindAddr(Port(port), address)
skt = i.dset(skt, "address".newVal, address.newVal)
skt = i.dset(skt, "port".newVal, port.newVal)
skt.objType = "socket"
skt.obj = socket[].addr
socket.listen()
i.push skt
def.symbol("accept") do (i: In):
let vals = i.expect("dict:socket", "dict:socket")
var client = vals[0]
var server = vals[1]
var address = ""
var serverSocket = server.toSocket
var clientSocket = client.toSocket
serverSocket.acceptAddr(clientSocket, address)
i.dset(client, "address".newVal, address.newVal)
client.objType = "socket"
client.obj = clientSocket[].addr
i.push client
def.symbol("connect") do (i: In):
let vals = i.expect("int", "string", "dict:socket")
let port = vals[0]
let address = vals[1]
var skt = vals[2]
let socket = skt.toSocket
socket.connect(address.getString, Port(port.intVal))
skt = i.dset(skt, "address".newVal, address)
skt = i.dset(skt, "port".newVal, port)
skt.objType = "socket"
skt.obj = socket[].addr
i.push skt
def.symbol("send") do (i: In):
let vals = i.expect("string", "dict:socket")
let msg = vals[0]
let skt = vals[1]
skt.toSocket.send msg.getString
def.symbol("recv") do (i: In):
let vals = i.expect("int", "dict:socket")
let size = vals[0]
let skt = vals[1]
var s = ""
discard skt.toSocket.recv(s, size.intVal.int)
i.push s.newVal
def.symbol("recv-line") do (i: In):
let vals = i.expect("dict:socket")
let skt = vals[0]
var s = skt.toSocket.recvLine()
i.push s.newVal
def.finalize("net")
|