X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=network.c;h=27048fb8886231e58bd785863fd7915e5d360c22;hb=61d4952a59c72dab12aa5cb9100d4433b2cdcedf;hp=74e03bf720187fe7dc2cd85393ba0dd0d01a82f4;hpb=5f6a4f9df6c8accc89f1920bfe9ace3cbac4c4b6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/network.c b/network.c index 74e03bf..27048fb 100644 --- a/network.c +++ b/network.c @@ -11,15 +11,24 @@ #include "world.h" #include "world_sfd.h" #include "world_routes.h" -#include "vg/vg_imgui.h" +#include "vg/vg_ui/imgui.h" #include "gui.h" #include "ent_region.h" +#include "vg/vg_loader.h" + +#ifdef _WIN32 + #include + #include +#else + #include + #include + #include +#endif struct network_client network_client = { .auth_mode = eServerModeAuthentication, .state = k_ESteamNetworkingConnectionState_None, - .server_adress = "46.101.34.155", .last_intent_change = -99999.9 }; @@ -328,8 +337,9 @@ void network_status_string( vg_str *str, u32 *colour ) if( state == k_ESteamNetworkingConnectionState_None ) vg_strcat( str, "No Connection" ); - else if( state == k_ESteamNetworkingConnectionState_Connecting ){ - vg_strcat( str, "Connecting to:\nskaterift.com" ); + else if( state == k_ESteamNetworkingConnectionState_Connecting ) + { + vg_strcatf( str, "Connecting...\n%s", network_client.host_adress ); if( network_client.retries ){ vg_strcat( str, "\n(" ); @@ -338,7 +348,7 @@ void network_status_string( vg_str *str, u32 *colour ) } } else if( state == k_ESteamNetworkingConnectionState_Connected ){ - vg_strcat( str, "Connected to:\nskaterift.com" ); + vg_strcatf( str, "Connected to:\n%s", network_client.host_adress ); *colour = 0xff00a020; } else if( state == k_ESteamNetworkingConnectionState_ClosedByPeer ) @@ -364,11 +374,14 @@ void render_server_status_gui(void) { render_fb_bind( gpipeline.fb_workshop_preview, 0 ); + vg_ui_set_screen( 128, 48 ); + ui_context *ctx = &vg_ui.ctx; + /* HACK */ - vg_ui.cur_vert = 0; - vg_ui.cur_indice = 0; - vg_ui.vert_start = 0; - vg_ui.indice_start = 0; + ctx->cur_vert = 0; + ctx->cur_indice = 0; + ctx->vert_start = 0; + ctx->indice_start = 0; ui_rect r = { 0, 0, 128, 48 }; @@ -379,9 +392,9 @@ void render_server_status_gui(void) u32 bg = 0xff000000; network_status_string( &str, &bg ); - ui_fill( r, bg ); - ui_text( r, buf, 1, k_ui_align_center, 0 ); - ui_flush( k_ui_shader_colour, 128, 48 ); + ui_fill( ctx, r, bg ); + ui_text( ctx, r, buf, 1, k_ui_align_center, 0 ); + ui_flush( ctx, k_ui_shader_colour, NULL ); skaterift.rt_textures[ k_skaterift_rt_server_status ] = gpipeline.fb_workshop_preview->attachments[0].id; @@ -469,26 +482,37 @@ static void on_persona_state_change( CallbackMsg_t *msg ){ } } -static void network_connect(void){ - char ip_buf[128]; - vg_str str; - vg_strnull( &str, ip_buf, sizeof(ip_buf) ); - vg_strcat( &str, network_client.server_adress ); - vg_strcat( &str, ":" ); - vg_strcati32( &str, NETWORK_PORT ); +void network_set_host( const char *host_str, const char *port_str ) +{ + vg_strncpy( host_str, network_client.host_adress, + sizeof(network_client.host_adress), k_strncpy_overflow_fatal ); + + memset( &network_client.ip, 0, sizeof(network_client.ip) ); + network_client.ip_resolved = 0; - if( !vg_strgood(&str) ) return; + if( port_str ) + { + vg_strncpy( port_str, network_client.host_port, + sizeof(network_client.host_port), k_strncpy_overflow_fatal ); + } + else + { + vg_str str; + vg_strnull( &str, network_client.host_port, + sizeof(network_client.host_port) ); + vg_strcati32( &str, NETWORK_PORT ); + } - /* Connect to server if not connected */ - SteamNetworkingIPAddr remoteAddr; - SteamAPI_SteamNetworkingIPAddr_ParseString( &remoteAddr, str.buffer ); + network_client.ip.m_port = atoi( network_client.host_port ); +} - char buf[256]; - SteamAPI_SteamNetworkingIPAddr_ToString( &remoteAddr, buf, 256, 1 ); - vg_info( "connect to: %s\n", buf ); +static void network_connect(void) +{ + VG_ASSERT( network_client.ip_resolved ); + vg_info( "connecting...\n" ); network_client.remote = SteamAPI_ISteamNetworkingSockets_ConnectByIPAddress( - hSteamNetworkingSockets, &remoteAddr, 0, NULL ); + hSteamNetworkingSockets, &network_client.ip, 0, NULL ); } static void network_sign_on_complete(void){ @@ -552,6 +576,79 @@ static void poll_remote_connection(void){ } } +static void network_resolve_host_async( void *payload, u32 size ) +{ + u32 *status = payload; + network_client.ip_resolved = *status; + + char buf[256]; + SteamAPI_SteamNetworkingIPAddr_ToString( &network_client.ip, buf, 256, 1 ); + vg_info( "Resolved host address to: %s\n", buf ); +} + +static void network_resolve_host_thread( void *_ ) +{ + vg_async_item *call = vg_async_alloc(8); + u32 *status = call->payload; + *status = 0; + + if( (network_client.host_adress[0] >= '0') && + (network_client.host_adress[0] <= '9') ) + { + SteamAPI_SteamNetworkingIPAddr_ParseString( + &network_client.ip, + network_client.host_adress ); + network_client.ip.m_port = atoi( network_client.host_port ); + *status = 1; + goto end; + } + + vg_info( "Resolving host.. %s (:%s)\n", + network_client.host_adress, network_client.host_port ); + + struct addrinfo hints; + struct addrinfo *result; + + /* Obtain address(es) matching host/port. */ + + memset( &hints, 0, sizeof(hints) ); + hints.ai_family = AF_INET6; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG; + hints.ai_protocol = 0; + + int s = getaddrinfo( network_client.host_adress, network_client.host_port, + &hints, &result); + if( s != 0 ) + { +#ifndef _WIN32 + vg_error( "getaddrinfo: %s\n", gai_strerror(s) ); +#endif + + if( !strcmp( network_client.host_adress, "skaterift.com" ) ) + { + vg_warn( "getaddrinfo failed for skaterift.com;\n " + "falling back to a hardcoded IPv4\n" ); + strcpy( network_client.host_adress, "46.101.34.155" ); + SteamAPI_SteamNetworkingIPAddr_ParseString( + &network_client.ip, + network_client.host_adress ); + network_client.ip.m_port = NETWORK_PORT; + *status = 1; + } + + goto end; + } + + struct sockaddr_in6 *inaddr = (struct sockaddr_in6 *)result->ai_addr; + memcpy( network_client.ip.m_ipv6, &inaddr->sin6_addr, 16 ); + freeaddrinfo( result ); + + *status = 1; + +end: vg_async_dispatch( call, network_resolve_host_async ); +} + void network_update(void) { if( !steam_ready ) @@ -559,18 +656,21 @@ void network_update(void) ESteamNetworkingConnectionState state = network_client.state; - if( network_client.user_intent == k_server_intent_offline ){ + if( network_client.user_intent == k_server_intent_offline ) + { if( state != k_ESteamNetworkingConnectionState_None ) network_disconnect(); return; } - if( state == k_ESteamNetworkingConnectionState_Connected ){ + if( state == k_ESteamNetworkingConnectionState_Connected ) + { poll_remote_connection(); f64 frame_delta = vg.time_real - network_client.last_frame; - if( frame_delta > NETWORK_FRAMERATE ){ + if( frame_delta > NETWORK_FRAMERATE ) + { network_client.last_frame = vg.time_real; remote_player_send_playerframe(); localplayer.sfx_buffer_count = 0; @@ -578,12 +678,15 @@ void network_update(void) remote_player_debug_update(); } - else { + else + { if( (state == k_ESteamNetworkingConnectionState_Connecting) || - (state == k_ESteamNetworkingConnectionState_FindingRoute) ){ + (state == k_ESteamNetworkingConnectionState_FindingRoute) ) + { return; } - else { + else + { f64 waited = vg.time_real - network_client.last_attempt, min_wait = 1.0; @@ -592,8 +695,18 @@ void network_update(void) if( waited < min_wait ) return; + + if( !network_client.ip_resolved ) + { + if( vg_loader_availible() ) + { + vg_loader_start( network_resolve_host_thread, NULL ); + } + else return; + } + else + network_connect(); - network_connect(); network_client.retries ++; network_client.last_attempt = vg.time_real; } @@ -639,6 +752,8 @@ void network_init(void) { vg_console_reg_var( "network_info", &network_client.network_info, k_var_dtype_i32, VG_VAR_PERSISTENT ); + vg_console_reg_var( "auto_connect", &network_client.auto_connect, + k_var_dtype_i32, VG_VAR_PERSISTENT ); if( steam_ready ){ u32 alloc_size = sizeof(struct network_request)*NETWORK_MAX_REQUESTS; network_client.request_buffer =