net: listen and accept

pull/1049/head
Alexander Medvednikov 2019-06-30 20:57:25 +02:00
parent 9062338cb4
commit 6a1b16c72c
2 changed files with 74 additions and 2 deletions

View File

@ -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)
}
}

View File

@ -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)
}