From: jxnshi Date: Mon, 3 Feb 2025 20:35:08 +0000 (+0100) Subject: Update X-Git-Url: https://jxnshi.xyz/repos?a=commitdiff_plain;h=5aef62d0706e9262a6b6370f1c268978deb3a32e;p=mesange.git Update --- diff --git a/client-cli/client-cli b/client-cli/client-cli index 04e6537..b68c1dc 100755 Binary files a/client-cli/client-cli and b/client-cli/client-cli differ diff --git a/client-cli/command.odin b/client-cli/command.odin index 9a6482b..8789067 100644 --- a/client-cli/command.odin +++ b/client-cli/command.odin @@ -196,16 +196,16 @@ handle_command :: proc(app: ^App, command: string) -> Maybe(Handle_Command_Error room_id = room_get_id(room), } - request_id, err := request_host(app, request, &app.profile.private_key) + // request_id, err := request_host(app, request, &app.profile.private_key) - if err != nil { - app_set_info_bar(app, "Could not subscribe to room.") - return .Command_Failed - } + // if err != nil { + // app_set_info_bar(app, "Could not subscribe to room.") + // return .Command_Failed + // } - response := wait_host_response(app, request_id) + // response := wait_host_response(app, request_id) - log.infof("Response %v", response) + // log.infof("Response %v", response) app_remove_room(app, app.selected_room) app_set_info_bar(app, "Room removed.") diff --git a/client-cli/host.odin b/client-cli/host.odin index d1f280c..d87e77f 100644 --- a/client-cli/host.odin +++ b/client-cli/host.odin @@ -56,10 +56,10 @@ request_host :: proc( receive_host :: proc(app: ^App) -> (id: u32, message: common.Server_Message, err: common.Error) { buffer: [1_000]u8 - packet := common.receive_packet(app.host.?) or_return + packet := common.receive_packet(app.host.?, buffer[:]) or_return packet_buffer: bytes.Buffer - packet_buffer.buf = slice.into_dynamic(bytes_buf[:]) - packet_stream := bytes.buffer_to_stream(&bytes_buffer) + packet_buffer.buf = slice.into_dynamic(packet) + packet_stream := bytes.buffer_to_stream(&packet_buffer) return common.server_message_from_bytes(app.host.?, packet_stream) } @@ -71,8 +71,9 @@ wait_host_response :: proc(app: ^App, id: u32) -> common.Server_Response { sync.mutex_lock(&app.mutex) defer sync.mutex_unlock(&app.mutex) - for response in app.responses { - if response.id == id { + for res_id, response in app.waiting_responses { + if res_id == id { + delete_key(&app.waiting_responses, res_id) return response } } diff --git a/client-cli/main.odin b/client-cli/main.odin index 9a7cb14..00009cb 100644 --- a/client-cli/main.odin +++ b/client-cli/main.odin @@ -62,7 +62,7 @@ App :: struct { seed_phrase_checksum: u8, host: Maybe(net.TCP_Socket), - waiting_responses: [dynamic]common.Server_Response, + waiting_responses: map[u32]common.Server_Response, selected_room: int, } @@ -113,7 +113,7 @@ app_init :: proc(storage_path: string) -> App { info_bar = info_bar, input_window = input_window, - waiting_responses = make([dynamic]common.Server_Response), + waiting_responses = make(map[u32]common.Server_Response), } app_update_info_bar(&app) @@ -127,6 +127,10 @@ app_deinit :: proc(app: ^App) { sync.mutex_lock(&app.mutex) defer sync.mutex_unlock(&app.mutex) + for _, response in app.waiting_responses { + common.server_response_deinit(response) + } + delete(app.waiting_responses) if host, ok := app.host.?; ok { @@ -736,16 +740,33 @@ main :: proc() { free_all(context.temp_allocator) } - server_message := receive_host(&app) - - #partial switch message in server_message { - case common.Server_Response: - response := message + state: State + { sync.mutex_lock(&app.mutex) defer sync.mutex_unlock(&app.mutex) - append(&app.waiting_responses, response) + state = app.state } + + // #partial switch state { + // case .Room_List, .Room: + // message_id, server_message, err := receive_host(&app) + + // if err != nil { + // log.errorf("Failed to receive server message with error %v", err) + // continue + // } + + // #partial switch message in server_message { + // case common.Server_Response: + // response := message + + // sync.mutex_lock(&app.mutex) + // defer sync.mutex_unlock(&app.mutex) + + // app.waiting_responses[message_id] = response + // } + // } } } diff --git a/common/request.odin b/common/request.odin index ecf7793..b8d59c1 100644 --- a/common/request.odin +++ b/common/request.odin @@ -10,6 +10,7 @@ import "core:net" import "core:math/rand" import "core:mem" import "core:slice" +import "core:strings" import "core:time" ROOM_KEY_SIZE :: 32 @@ -41,6 +42,7 @@ Request_Verify_Error :: enum { Error :: union { Receive_Packet_Error, Receive_Request_Error, + Receive_Message_Error, Client_Request_From_Bytes_Error, @@ -270,8 +272,20 @@ Server_Response :: union { string, } +server_response_deinit :: proc(response: Server_Response) { + switch r in response { + case string: + delete(r) + } +} + server_response_from_bytes :: proc(stream: io.Stream) -> (response: Server_Response, err: Error) { - + buffer: [1_000]u8 + _, _ = io.read(stream, buffer[:]) + + response, _ = strings.clone_from_bytes(buffer[:]) + + return response, nil } Server_Message :: union { @@ -287,7 +301,7 @@ server_message_from_bytes :: proc(server: net.TCP_Socket, stream: io.Stream) -> id_bytes: [size_of(u32)]u8 _, _ = io.read(stream, id_bytes[:]) - id, _ := endian.get_u32(.Little, id_bytes[:]) + id, _ = endian.get_u32(id_bytes[:], .Little) switch message_type { // Request. @@ -295,33 +309,39 @@ server_message_from_bytes :: proc(server: net.TCP_Socket, stream: io.Stream) -> // Response. case 1: - + message, err = server_response_from_bytes(stream) case: - return nil, common.Receive_Message_Error.Invalid_Type + return 0, nil, Receive_Message_Error.Invalid_Type } + + return id, message, err } receive_packet :: proc(socket: net.TCP_Socket, buffer: []u8) -> (packet: []u8, err: Error) { length_bytes: [size_of(u32)]u8 - _ = net.recv_tcp(client, length_bytes[:]) or_return + bytes_read := net.recv_tcp(socket, length_bytes[:]) or_return + + if bytes_read == 0 { + return {}, Receive_Packet_Error.Packet_Empty + } length, _ := endian.get_u32(length_bytes[:], .Little) if length == 0 { - return {}, common.Receive_Packet_Error.Packet_Empty + return {}, Receive_Packet_Error.Packet_Empty } if int(length) > len(buffer) { // Empty the socket buffer. for _ in 0.. (id: u32, request: common.Cli request_bytes := packet[size_of(u32):] request_buffer: bytes.Buffer - request_buffer.buf = slice.into_dynamic(bytes_buf[:]) - request_stream := bytes.buffer_to_stream(&bytes_buffer) + request_buffer.buf = slice.into_dynamic(request_bytes[:]) + request_stream := bytes.buffer_to_stream(&request_buffer) - request, err = common.client_request_from_bytes(request_stream) + request, err = common.client_request_from_bytes(request_stream) return id, request, err } diff --git a/server/main.odin b/server/main.odin index b4755dc..66e954e 100644 --- a/server/main.odin +++ b/server/main.odin @@ -47,6 +47,22 @@ handle_client :: proc(data: Handle_Client_Data) { request_id, request, err1 := receive_request(client_socket) if err1 != nil { + #partial switch err in err1 { + case common.Receive_Packet_Error: + #partial switch err { + case .Packet_Empty: + return + } + + case net.Network_Error: + #partial switch err.(net.TCP_Recv_Error) { + case .Connection_Closed: + return + } + } + + log.infof("Request error %v", err1) + response_string := "Invalid request" response = transmute([]u8)response_string diff --git a/server/server b/server/server index 4970315..829a1fa 100755 Binary files a/server/server and b/server/server differ