net: listen and accept
parent
9062338cb4
commit
6a1b16c72c
|
@ -18,8 +18,13 @@ struct Listener {
|
|||
|
||||
import const (
|
||||
AF_UNSPEC
|
||||
AF_INET
|
||||
SOCK_STREAM
|
||||
AI_PASSIVE
|
||||
PF_INET
|
||||
SOL_SOCKET
|
||||
SO_REUSEADDR
|
||||
INADDR_ANY
|
||||
)
|
||||
|
||||
struct C.addrinfo {
|
||||
|
@ -33,6 +38,24 @@ mut:
|
|||
ai_addr voidptr
|
||||
}
|
||||
|
||||
struct C.in_addr {
|
||||
mut:
|
||||
s_addr int
|
||||
|
||||
}
|
||||
|
||||
struct C.sockaddr_in {
|
||||
mut:
|
||||
sin_family int
|
||||
sin_port int
|
||||
sin_addr C.in_addr
|
||||
|
||||
}
|
||||
|
||||
struct C.sockaddr_storage {
|
||||
|
||||
}
|
||||
|
||||
fn dial(addr string, port int) Conn {
|
||||
println('net.dial("$addr":$port)')
|
||||
mut hints := C.addrinfo{}
|
||||
|
@ -76,3 +99,52 @@ fn dial(addr string, port int) Conn {
|
|||
return conn
|
||||
}
|
||||
|
||||
fn listen(addr string, port int) Listener {
|
||||
mut hints := C.addrinfo{}
|
||||
res := &C.addrinfo{!}
|
||||
new_fd := 0
|
||||
BACKLOG := 10
|
||||
strport := port.str()
|
||||
option := 1
|
||||
listener := C.socket(PF_INET, SOCK_STREAM, 0)
|
||||
C.setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(int))
|
||||
bad_listener := Listener{their_addr: 0}
|
||||
if listener < 0 {
|
||||
println('couldnt create listen scoket')
|
||||
return bad_listener
|
||||
}
|
||||
// socket address used for the server
|
||||
mut server_address := C.sockaddr_in{}
|
||||
server_address.sin_family = AF_INET
|
||||
// htons: host to network short: transforms a value in host byte
|
||||
// ordering format to a short value in network byte ordering format
|
||||
server_address.sin_port = C.htons(port)
|
||||
// htonl: host to network long: same as htons but to long
|
||||
server_address.sin_addr.s_addr = C.htonl(INADDR_ANY)
|
||||
// size := sizeof(C.sockaddr_in) // 16
|
||||
if C.bind(listener, &server_address, 16) < 0 {
|
||||
println('cant bind')
|
||||
return bad_listener
|
||||
}
|
||||
if C.listen(listener, BACKLOG) < 0 {
|
||||
println('cant listen')
|
||||
return bad_listener
|
||||
}
|
||||
l := Listener {
|
||||
listener: listener,
|
||||
their_addr: 0
|
||||
}
|
||||
return l
|
||||
}
|
||||
|
||||
// accept an incoming connection
|
||||
fn (l Listener) accept() Conn {
|
||||
their_addr := C.sockaddr_storage{}
|
||||
addr_size := 128 // sizeof (l.their_addr)
|
||||
return Conn {
|
||||
sockfd: C.accept(l.listener, &their_addr, &addr_size)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import net
|
||||
|
||||
fn test_dial() {
|
||||
//conn := net.dial('irc.freenode.org', 6667)
|
||||
//println(conn.sockfd)
|
||||
conn := net.dial('irc.freenode.org', 6667)
|
||||
println(conn.sockfd)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue