diff --git a/examples/listen_on_anyaddr b/examples/listen_on_anyaddr new file mode 100755 index 0000000..9c529b5 Binary files /dev/null and b/examples/listen_on_anyaddr differ diff --git a/examples/listen_on_anyaddr.v b/examples/listen_on_anyaddr.v index 94be062..a8f4d91 100644 --- a/examples/listen_on_anyaddr.v +++ b/examples/listen_on_anyaddr.v @@ -1,5 +1,16 @@ import netio +// This program starts a server that listens for TCP connections on port 1081. +// The program listens on all addresses available in the operating system, +// including IPv4 and IPv6. +// +// Run the program and try connecting using the telnet utility: +// +// telnet 127.0.0.1 1081 # IPv4 +// telnet ::1 1081 # IPv6 +// +// This program fails if operation system does not support IPv6 or IPv6 is disabled. + fn main() { // We want to bind a server socket to the all available local addresses, // (both IPv4 and IPv6) so collect the address info entries for it. @@ -58,43 +69,37 @@ fn main() { println('Listening on ${listen_addr}...') - // Accept the connection from remote. This is a blocking call. - // conn will store the new socket connected to the remote. - conn, remote_addr := socket.accept() or { - eprintln('ACCEPT: ${err}') - exit(1) + for { + // Accept the connection from remote. This is a blocking call. + // conn will store the new socket connected to the remote. + conn, remote_addr := socket.accept() or { + eprintln('ACCEPT: ${err}') + exit(1) + } + + // Close connection on exit. + defer { + conn.close() or { panic(err) } + } + + // Get remote host and port in numeric format. + remote_host, remote_port := netio.name_info(remote_addr, + flags: netio.ni_numerichost | netio.ni_numericserv + )! + + eprintln('Accepted connection. Remote address: ${remote_host}, remote port: ${remote_port}') + + // Read 512 bytes of data from socket. + mut buf := []u8{len: 512} // Initialize the buffer to store message. + // Receive data and write it to the buffer. + read := conn.recv(mut buf, 0) or { + eprintln('RECV: ${err}') + exit(1) + } + + // Create a string from buffer without the trailing zeros. + msg := unsafe { tos_clone(buf.data) } + + eprintln('Received from client: ${read} bytes, data: ${msg}') } - - // Close connection on exit. - defer { - conn.close() or { panic(err) } - } - - // Get remote host and port in numeric format. - remote_host, remote_port := netio.name_info(remote_addr, - flags: netio.ni_numerichost | netio.ni_numericserv - )! - - eprintln('Accpeted connection. Remote address: ${remote_host}, remote port: ${remote_port}') - - // Read 512 bytes of data from socket. - mut buf := []u8{len: 512} // Initialize the buffer to store message. - // Receive data and write it to the buffer. - read := conn.recv(mut buf, 0) or { - eprintln('RECV: ${err}') - exit(1) - } - - // Create a string from buffer without the trailing zeros. - msg := unsafe { tos_clone(buf.data) } - - eprintln('Received from client: ${read} bytes, data: ${msg}') - - // Send reply to the client. - sent := conn.send(msg.bytes(), 0) or { - eprintln('SEND: ${err}') - exit(1) - } - - eprintln('Sent to the client: ${sent} bytes, data: ${msg}') }