-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsocket.nit
More file actions
81 lines (68 loc) · 2.29 KB
/
socket.nit
File metadata and controls
81 lines (68 loc) · 2.29 KB
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
module socket
import ffsocket
class Socket
var address: String
var host: nullable String
var port: Int
private var socket: FFSocket
private var addrin: FFSocketAddrIn
init streamWithHost(thost: String, tport: Int)
do
socket = new FFSocket.socket( new FFSocketAddressFamilies.af_inet, new FFSocketTypes.sock_stream, new FFSocketProtocolFamilies.pf_null )
var hostname = socket.gethostbyname(thost)
addrin = new FFSocketAddrIn.withHostent(hostname, tport)
address = addrin.address
host = hostname.h_name
port = addrin.port
end
init streamWithPort(tport: Int)
do
socket = new FFSocket.socket( new FFSocketAddressFamilies.af_inet, new FFSocketTypes.sock_stream, new FFSocketProtocolFamilies.pf_null )
addrin = new FFSocketAddrIn.with(tport, new FFSocketAddressFamilies.af_inet)
address = addrin.address
port = addrin.port
host = null
end
init primitiveInit(h: FFSocketAcceptResult)
do
socket = h.socket
addrin = h.addrIn
address = addrin.address
port = addrin.port
host = null
end
fun connect:Bool do return socket.connect(addrin) >= 0
fun write(msg: String):Bool do return socket.write(msg) >= 0
fun read:String do return socket.read
fun close:Bool do return socket.close >= 0
fun bind:Bool do return socket.bind(addrin) >= 0
fun listen(size: Int):Bool do return socket.listen(size) >= 0
fun accept:Socket do return new Socket.primitiveInit(socket.accept)
fun errno:Int do return socket.errno
end
class SocketSet
var sset: FFSocketSet
init do sset = new FFSocketSet end
fun set(s: Socket) do sset.set(s.socket) end
fun isSet(s: Socket):Bool do return sset.isSet(s.socket) end
fun zero do sset.zero end
fun clear(s: Socket) do sset.clear(s.socket) end
end
class SocketObserver
private var observer: FFSocketObserver
var readset: nullable SocketSet = null
var writeset: nullable SocketSet = null
var exceptset: nullable SocketSet = null
init(read :Bool, write :Bool, except: Bool)
do
if read then readset = new SocketSet
if write then writeset = new SocketSet
if except then exceptset = new SocketSet
observer = new FFSocketObserver
end
fun select(max: Socket,seconds: Int, microseconds: Int):Bool
do
var timeval = new FFTimeval(seconds, microseconds)
return observer.select(max.socket, readset.sset, writeset.sset, readset.sset, timeval) > 0
end
end