From 6a1b16c72c9a8561df31cb884883f1d928dc6a56 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Sun, 30 Jun 2019 20:57:25 +0200 Subject: [PATCH] net: listen and accept --- vlib/net/socket.v | 72 ++++++++++++++++++++++++++++++++++++++++++ vlib/net/socket_test.v | 4 +-- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/vlib/net/socket.v b/vlib/net/socket.v index 1660248cbb..e0b1190b6d 100644 --- a/vlib/net/socket.v +++ b/vlib/net/socket.v @@ -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) + } +} + + + diff --git a/vlib/net/socket_test.v b/vlib/net/socket_test.v index b8c9625f94..5216d65873 100644 --- a/vlib/net/socket_test.v +++ b/vlib/net/socket_test.v @@ -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) }