net.websocket: fix server not listening for IPv4 (#12717)
parent
d85111e3dd
commit
09955b7ce8
|
@ -164,8 +164,15 @@ pub fn resolve_ipaddrs(addr string, family AddrFamily, typ SocketType) ?[]Addr {
|
||||||
address, port := split_address(addr) ?
|
address, port := split_address(addr) ?
|
||||||
|
|
||||||
if addr[0] == `:` {
|
if addr[0] == `:` {
|
||||||
// Use in6addr_any
|
match family {
|
||||||
return [new_ip6(port, net.addr_ip6_any)]
|
.ip6 {
|
||||||
|
return [new_ip6(port, net.addr_ip6_any)]
|
||||||
|
}
|
||||||
|
.ip, .unspec {
|
||||||
|
return [new_ip(port, net.addr_ip_any)]
|
||||||
|
}
|
||||||
|
else {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mut hints := C.addrinfo{
|
mut hints := C.addrinfo{
|
||||||
|
@ -200,7 +207,18 @@ pub fn resolve_ipaddrs(addr string, family AddrFamily, typ SocketType) ?[]Addr {
|
||||||
|
|
||||||
for result := results; !isnil(result); result = result.ai_next {
|
for result := results; !isnil(result); result = result.ai_next {
|
||||||
match AddrFamily(result.ai_family) {
|
match AddrFamily(result.ai_family) {
|
||||||
.ip, .ip6 {
|
.ip {
|
||||||
|
new_addr := Addr{
|
||||||
|
addr: AddrData{
|
||||||
|
Ip: Ip{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unsafe {
|
||||||
|
C.memcpy(&new_addr, result.ai_addr, result.ai_addrlen)
|
||||||
|
}
|
||||||
|
addresses << new_addr
|
||||||
|
}
|
||||||
|
.ip6 {
|
||||||
new_addr := Addr{
|
new_addr := Addr{
|
||||||
addr: AddrData{
|
addr: AddrData{
|
||||||
Ip6: Ip6{}
|
Ip6: Ip6{}
|
||||||
|
|
|
@ -237,7 +237,11 @@ fn new_udp_socket_for_remote(raddr Addr) ?&UdpSocket {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
match raddr.family() {
|
match raddr.family() {
|
||||||
.ip, .ip6 {
|
.ip {
|
||||||
|
// Use ip dualstack
|
||||||
|
addr = new_ip(0, addr_ip_any)
|
||||||
|
}
|
||||||
|
.ip6 {
|
||||||
// Use ip6 dualstack
|
// Use ip6 dualstack
|
||||||
addr = new_ip6(0, addr_ip6_any)
|
addr = new_ip6(0, addr_ip6_any)
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,21 +15,20 @@ fn echo_server(mut c net.UdpConn) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
local_addr = ':40003'
|
server_addr = '127.0.0.1:40003'
|
||||||
remote_addr = 'localhost:40003'
|
|
||||||
)
|
)
|
||||||
|
|
||||||
fn echo() ? {
|
fn echo() ? {
|
||||||
mut c := net.dial_udp(remote_addr) ?
|
mut c := net.dial_udp(server_addr) or { panic('could not net.dial_udp: $err') }
|
||||||
defer {
|
defer {
|
||||||
c.close() or {}
|
c.close() or {}
|
||||||
}
|
}
|
||||||
data := 'Hello from vlib/net!'
|
data := 'Hello from vlib/net!'
|
||||||
|
|
||||||
c.write_string(data) ?
|
c.write_string(data) or { panic('could not write_string: $err') }
|
||||||
|
|
||||||
mut buf := []byte{len: 100, init: 0}
|
mut buf := []byte{len: 100, init: 0}
|
||||||
read, addr := c.read(mut buf) ?
|
read, addr := c.read(mut buf) or { panic('could not read: $err') }
|
||||||
|
|
||||||
assert read == data.len
|
assert read == data.len
|
||||||
println('Got address $addr')
|
println('Got address $addr')
|
||||||
|
@ -47,17 +46,10 @@ fn echo() ? {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_udp() {
|
fn test_udp() {
|
||||||
mut l := net.listen_udp(local_addr) or {
|
mut l := net.listen_udp(server_addr) or { panic('could not listen_udp: $err') }
|
||||||
println(err)
|
|
||||||
assert false
|
|
||||||
panic('')
|
|
||||||
}
|
|
||||||
|
|
||||||
go echo_server(mut l)
|
go echo_server(mut l)
|
||||||
echo() or {
|
echo() or { panic('could not echo: $err') }
|
||||||
println(err)
|
|
||||||
assert false
|
|
||||||
}
|
|
||||||
|
|
||||||
l.close() or {}
|
l.close() or {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,11 +4,6 @@ import net.websocket
|
||||||
import time
|
import time
|
||||||
import rand
|
import rand
|
||||||
|
|
||||||
// TODO: fix connecting to ipv4 websockets
|
|
||||||
// (the server seems to work with .ip, but
|
|
||||||
// Client can not connect, it needs to be passed
|
|
||||||
// .ip too?)
|
|
||||||
|
|
||||||
struct WebsocketTestResults {
|
struct WebsocketTestResults {
|
||||||
pub mut:
|
pub mut:
|
||||||
nr_messages int
|
nr_messages int
|
||||||
|
@ -34,8 +29,7 @@ fn test_ws_ipv6() {
|
||||||
|
|
||||||
// tests with internal ws servers
|
// tests with internal ws servers
|
||||||
fn test_ws_ipv4() {
|
fn test_ws_ipv4() {
|
||||||
// TODO: fix client
|
if should_skip {
|
||||||
if true || should_skip {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
port := 30000 + rand.intn(1024)
|
port := 30000 + rand.intn(1024)
|
||||||
|
@ -68,7 +62,7 @@ fn start_server(family net.AddrFamily, listen_port int) ? {
|
||||||
s.on_close(fn (mut ws websocket.Client, code int, reason string) ? {
|
s.on_close(fn (mut ws websocket.Client, code int, reason string) ? {
|
||||||
// not used
|
// not used
|
||||||
})
|
})
|
||||||
s.listen() or {}
|
s.listen() or { panic('websocket server could not listen') }
|
||||||
}
|
}
|
||||||
|
|
||||||
// ws_test tests connect to the websocket server from websocket client
|
// ws_test tests connect to the websocket server from websocket client
|
||||||
|
|
Loading…
Reference in New Issue