simple server/client

This commit is contained in:
2026-05-24 19:29:09 +02:00
parent 985ae50934
commit f3314587d8
3 changed files with 35 additions and 53 deletions
+7 -9
View File
@@ -2,16 +2,14 @@ package hanabi
import "core:fmt"
import "core:net"
import "core:os"
client_connect :: proc(addr: net.Endpoint) -> net.TCP_Socket {
sock, dial_err := net.dial_tcp(addr)
if dial_err != nil do panic(fmt.tprintln("failed to dial", os.args[1]))
return sock
}
run_client :: proc(host: net.Endpoint) {
fmt.println("hello from client")
fmt.println(host)
run_client :: proc(host_addr: net.Endpoint) {
sock, list_err := net.dial_tcp(host_addr)
if list_err != nil do panic(fmt.tprintln("failed to dial:", net.to_string(host_addr)))
defer net.close(sock)
buf: [256]byte
net.recv(sock, buf[:])
fmt.println(transmute(string)buf[:])
}
+15 -15
View File
@@ -3,42 +3,42 @@ package hanabi
import "core:fmt"
import "core:net"
import "core:os"
import "core:strconv"
USAGE :: `usage: hanabi (-c[onnect] <p0> | -h[ost] <p1> <p2> [p3] [p4] [p5])
where px is of the form ip:port
USAGE :: `usage: hanabi (-c[onnect] <ip:port> | -h[ost] <ip:port> <n players>)
note: n players has to be between 2-5
example host:
$ hanabi -h 127.0.0.1:42069 127.0.0.1:42070
$ hanabi -h 127.0.0.1:42069 4
example player 1:
$ hanabi -c 127.0.0.1:42069
example player 2:
$ hanabi -c 127.0.0.1:42070`
$ hanabi -c 127.0.0.1:42069`
main :: proc() {
ok := false
N := len(os.args) - 2
defer if !ok do fmt.println(USAGE)
N := len(os.args) - 2
if N <= 0 do return
switch os.args[1] {
case "-c", "-connect", "--connect":
if N != 1 do return
addr, ok := net.parse_endpoint(os.args[2])
if !ok do panic(fmt.tprintln("failed to parse host endpoint:", os.args[2]))
if !ok do panic(fmt.tprintln("failed to parse endpoint:", os.args[2]))
run_client(addr)
case "-h", "-host", "--host":
if !(2 <= N && N <= 5) do return
addrs: [dynamic]net.Endpoint
defer delete(addrs)
for addr_str in os.args[2:] {
addr, ok := net.parse_endpoint(os.args[2])
if !ok do panic(fmt.tprintln("failed to parse player endpoint:", addr_str))
append(&addrs, addr)
}
run_server(addrs[:])
if N != 2 do return
addr, endpoint_ok := net.parse_endpoint(os.args[2])
if !endpoint_ok do panic(fmt.tprintln("failed to parse endpoint:", os.args[2]))
num_players, int_ok := strconv.parse_int(os.args[3])
if !int_ok do panic(fmt.tprintln("failed to parse number of players:", os.args[3]))
if num_players < 2 || num_players > 5 do return
run_server(addr, num_players)
case:
return
}
+13 -29
View File
@@ -3,37 +3,21 @@ package hanabi
import "core:fmt"
import "core:net"
Comm_World :: struct {
sockets: [dynamic]net.TCP_Socket,
}
run_server :: proc(listen_addr: net.Endpoint, num_players: int) {
listener, list_err := net.listen_tcp(listen_addr)
if list_err != nil do panic(fmt.tprintln("failed to listen:", net.to_string(listen_addr)))
defer net.close(listener)
create_socket :: proc(addr_str: string) -> (net.TCP_Socket, bool) {
addr, endpoint_ok := net.parse_endpoint(addr_str)
if !endpoint_ok {
fmt.eprintln("failed to parse endpoint")
return 0, false
}
sock, dial_error := net.listen_tcp(addr)
if dial_error != nil {
fmt.eprintln(addr_str, dial_error)
return 0, false
}
return sock, true
}
players: [dynamic]net.TCP_Socket
defer delete(players)
create_comm_world :: proc(addresses: []string) -> (comm: Comm_World) {
for addr_str in addresses {
sock, ok := create_socket(addr_str)
if !ok do panic(fmt.tprintfln("%s: failed to create socket", addr_str))
append(&comm.sockets, sock)
}
return
}
run_server :: proc(players: []net.Endpoint) {
fmt.println("hello from server")
for p in players {
fmt.println(p)
for len(players) < num_players {
client_sock, source, err := net.accept_tcp(listener)
if err != nil {
fmt.eprintln("failed to connect:", err, source)
}
append(&players, client_sock)
fmt.println("player connected:", net.to_string(source))
}
}