mirror of
https://github.com/vlang/v.git
synced 2025-08-03 09:47:15 -04:00
53 lines
1.4 KiB
V
53 lines
1.4 KiB
V
import net
|
|
import time
|
|
|
|
fn server_thread(c_chan chan int) {
|
|
errors_no_data := [net.err_timed_out.code(), int(net.error_ewouldblock), int(net.error_eagain),
|
|
int(net.error_eintr)]
|
|
mut buf := []u8{len: 128}
|
|
mut times := 0
|
|
mut read_len := 0
|
|
mut listener := net.listen_tcp(.ip, ':22444') or { panic(err) }
|
|
c_chan <- 1
|
|
mut server := listener.accept() or { panic(err) }
|
|
server.set_read_timeout(2 * time.second)
|
|
server.set_blocking(false) or { panic(err) }
|
|
read_len = server.read(mut buf) or { // nothing can be read yet
|
|
assert err.code() in errors_no_data
|
|
-1
|
|
}
|
|
assert read_len == -1 // ensure there is an error with no data
|
|
read_len = server.read(mut buf) or { // nothing can be read yet
|
|
assert err.code() in errors_no_data
|
|
-2
|
|
}
|
|
assert read_len == -2 // ensure there is an error with no data
|
|
c_chan <- 2
|
|
for times < 10 {
|
|
times++
|
|
time.sleep(1 * time.millisecond)
|
|
read_len = server.read(mut buf) or {
|
|
if err.code() in errors_no_data {
|
|
continue
|
|
} else {
|
|
panic(err)
|
|
}
|
|
}
|
|
if read_len > 0 {
|
|
break
|
|
}
|
|
}
|
|
assert unsafe { tos_clone(&buf[0]) == 'hello' }
|
|
}
|
|
|
|
fn test_non_blocking_read() {
|
|
mut c_chan := chan int{cap: 1}
|
|
server := spawn server_thread(c_chan)
|
|
_ := <-c_chan // 1
|
|
mut conn := net.dial_tcp('127.0.0.1:22444') or { panic(err) }
|
|
conn.set_blocking(false) or { panic(err) }
|
|
_ := <-c_chan // 2
|
|
conn.write('hello'.bytes()) or { panic(err) }
|
|
server.wait()
|
|
}
|