mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
net: listen and accept
This commit is contained in:
parent
9062338cb4
commit
6a1b16c72c
@ -18,8 +18,13 @@ struct Listener {
|
|||||||
|
|
||||||
import const (
|
import const (
|
||||||
AF_UNSPEC
|
AF_UNSPEC
|
||||||
|
AF_INET
|
||||||
SOCK_STREAM
|
SOCK_STREAM
|
||||||
AI_PASSIVE
|
AI_PASSIVE
|
||||||
|
PF_INET
|
||||||
|
SOL_SOCKET
|
||||||
|
SO_REUSEADDR
|
||||||
|
INADDR_ANY
|
||||||
)
|
)
|
||||||
|
|
||||||
struct C.addrinfo {
|
struct C.addrinfo {
|
||||||
@ -33,6 +38,24 @@ mut:
|
|||||||
ai_addr voidptr
|
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 {
|
fn dial(addr string, port int) Conn {
|
||||||
println('net.dial("$addr":$port)')
|
println('net.dial("$addr":$port)')
|
||||||
mut hints := C.addrinfo{}
|
mut hints := C.addrinfo{}
|
||||||
@ -76,3 +99,52 @@ fn dial(addr string, port int) Conn {
|
|||||||
return 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
|
import net
|
||||||
|
|
||||||
fn test_dial() {
|
fn test_dial() {
|
||||||
//conn := net.dial('irc.freenode.org', 6667)
|
conn := net.dial('irc.freenode.org', 6667)
|
||||||
//println(conn.sockfd)
|
println(conn.sockfd)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user