From 8f963412899cee20600f16db4423aeb5361f2c47 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 21 Jan 2022 12:48:58 -0600 Subject: [PATCH] better tcp server code --- core/net/tcp.onyx | 116 +++++++++++++++++++++++++++------------------- 1 file changed, 69 insertions(+), 47 deletions(-) diff --git a/core/net/tcp.onyx b/core/net/tcp.onyx index d2f4a8e0..2db30b6d 100644 --- a/core/net/tcp.onyx +++ b/core/net/tcp.onyx @@ -23,44 +23,6 @@ TCP_Connection :: struct { event_cursor := 0; } -TCP_Server :: struct { - use connection: TCP_Connection; - - Client :: struct { - use socket : Socket; - address : Socket_Address; - state : State; - - State :: enum { - Alive; - Dying; - Dead; - } - } - client_allocator: Allocator; - clients: [] ^Client; - - // max clients is stored as clients.count. - client_count: u32; - - listener_thread: thread.Thread; - - alive := true; - pulse_time_ms := 500; - - get_events :: tcp_get_events - listen :: tcp_server_listen - pulse :: tcp_server_pulse - send :: tcp_server_send - broadcast :: tcp_server_broadcast -} - -TCP_Client :: struct { - use connection: TCP_Connection; - - get_events :: tcp_get_events -} - TCP_Event :: struct { kind: Kind; data: rawptr; @@ -69,7 +31,7 @@ TCP_Event :: struct { Undefined; Connection; Disconnection; - Message; + Data; } Connection :: struct { @@ -86,7 +48,7 @@ TCP_Event :: struct { client : ^TCP_Server.Client; } - Message :: struct { + Data :: struct { address: ^Socket_Address; // This is only set when the event is coming from the server. client : ^TCP_Server.Client; @@ -106,8 +68,8 @@ tcp_get_events :: (use conn: ^TCP_Connection) -> Iterator(TCP_Event) { close :: (use conn: ^TCP_Connection) { for events { switch it.kind { - case .Message { - raw_free(event_allocator, (cast(^TCP_Event.Message) it.data).contents.data); + case .Data { + raw_free(event_allocator, (cast(^TCP_Event.Data) it.data).contents.data); } } @@ -126,6 +88,44 @@ tcp_get_events :: (use conn: ^TCP_Connection) -> Iterator(TCP_Event) { }; } + +// +// TCP Server +// + +TCP_Server :: struct { + use connection: TCP_Connection; + + Client :: struct { + use socket : Socket; + address : Socket_Address; + state : State; + + State :: enum { + Alive; + Dying; + Dead; + } + } + client_allocator: Allocator; + clients: [] ^Client; + + // max clients is stored as clients.count. + client_count: u32; + + listener_thread: thread.Thread; + + alive := true; + pulse_time_ms := 500; + + get_events :: tcp_get_events + listen :: tcp_server_listen + pulse :: tcp_server_pulse + send :: tcp_server_send + broadcast :: tcp_server_broadcast + handle_events :: tcp_server_handle_events +} + tcp_server_make :: (max_clients := 32, allocator := context.allocator) -> ^TCP_Server { socket, err := socket_create(.Inet, .Stream); // IPv6? if err != .None do return null; @@ -199,11 +199,11 @@ tcp_server_pulse :: (use server: ^TCP_Server) -> bool { continue; } - msg_event := new(TCP_Event.Message, allocator=server.event_allocator); - msg_event.client = it; - msg_event.address = ^it.address; - msg_event.contents = memory.copy_slice(msg_buffer[0 .. bytes_read], allocator=server.event_allocator); - server.events << .{ .Message, msg_event }; + data_event := new(TCP_Event.Data, allocator=server.event_allocator); + data_event.client = it; + data_event.address = ^it.address; + data_event.contents = memory.copy_slice(msg_buffer[0 .. bytes_read], allocator=server.event_allocator); + server.events << .{ .Data, data_event }; } for clients { @@ -243,6 +243,28 @@ tcp_server_broadcast :: (use server: ^TCP_Server, data: [] u8, except: ^TCP_Serv } } +tcp_server_handle_events :: macro (server: ^TCP_Server, handler: Code) { + while server->pulse() { + for server->get_events() { + #insert handler; + } + } +} + + +// +// TCP Client +// + +TCP_Client :: struct { + use connection: TCP_Connection; + + get_events :: tcp_get_events +} + + + + #local { tcp_server_kill_client :: (use server: ^TCP_Server, client: ^TCP_Server.Client) { client.state = .Dying; -- 2.25.1