1 // Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved
4 * This server application requires steamclient.so to be present in the
5 * executable directory. This is not provided by vg system, it must be
6 * downloaded via steamcmd. It will likely be somewhere in /usr/.steam/ ...
9 #define _DEFAULT_SOURCE
13 volatile sig_atomic_t sig_stop
;
15 void inthandler( int signum
)
22 #include "vg/vg_steam.h"
23 #include "vg/vg_steam_networking.h"
24 #include "vg/vg_steam_http.h"
25 #include "vg/vg_steam_auth.h"
26 #include "network_msg.h"
29 *hSteamNetworkingSockets
;
31 u8 steam_symetric_key
[ k_nSteamEncryptedAppTicketSymmetricKeyLen
];
32 HSteamNetPollGroup client_pollgroup
;
34 static void recieve_http( void *callresult
, void *context
)
36 HTTPRequestCompleted_t
*result
= callresult
;
38 HTTPRequestHandle request
= result
->m_hRequest
;
41 SteamAPI_ISteamHTTP_GetHTTPResponseBodySize( hSteamHTTP
, request
, &size
);
43 u8
*buffer
= malloc( size
);
44 SteamAPI_ISteamHTTP_GetHTTPResponseBodyData(
45 hSteamHTTP
, request
, buffer
, size
);
47 buffer
[size
-1] = '\0';
48 vg_info( "%s\n", (char *)buffer
);
51 SteamAPI_ISteamHTTP_ReleaseHTTPRequest( hSteamHTTP
, result
->m_hRequest
);
54 static void new_client_connecting( HSteamNetConnection client
)
56 EResult accept_status
= SteamAPI_ISteamNetworkingSockets_AcceptConnection(
57 hSteamNetworkingSockets
, client
);
59 if( accept_status
== k_EResultOK
)
61 vg_success( "Accepted client (id: %u)\n", client
);
62 SteamAPI_ISteamNetworkingSockets_SetConnectionPollGroup(
63 hSteamNetworkingSockets
,
64 client
, client_pollgroup
);
68 vg_warn( "Error accepting client (id: %u)\n", client
);
72 static void handle_steam_callback( CallbackMsg_t
*msg
)
74 if( msg
->m_iCallback
== k_iSteamNetConnectionStatusChangedCallBack
)
76 SteamNetConnectionStatusChangedCallback_t
*info
= (void *)msg
->m_pubParam
;
77 vg_info( " Connection status changed for %lu\n", info
->m_hConn
);
79 vg_info( " %s -> %s\n",
80 string_ESteamNetworkingConnectionState(info
->m_info
.m_eState
),
81 string_ESteamNetworkingConnectionState(info
->m_eOldState
) );
83 if( info
->m_info
.m_eState
==k_ESteamNetworkingConnectionState_Connecting
)
85 new_client_connecting( info
->m_hConn
);
88 else if( msg
->m_iCallback
== k_iSteamNetAuthenticationStatus
)
90 SteamNetAuthenticationStatus_t
*info
= (void *)msg
->m_pubParam
;
91 vg_info( " Authentication availibility: %s\n",
92 string_ESteamNetworkingAvailability(info
->m_eAvail
) );
93 vg_info( " %s\n", info
->m_debugMsg
);
97 static void poll_connections(void)
99 SteamNetworkingMessage_t
*messages
[32];
104 len
= SteamAPI_ISteamNetworkingSockets_ReceiveMessagesOnPollGroup(
105 hSteamNetworkingSockets
,
106 client_pollgroup
, messages
, vg_list_size(messages
) );
111 for( int i
=0; i
<len
; i
++ )
113 SteamNetworkingMessage_t
*msg
= messages
[i
];
115 if( msg
->m_cbSize
< sizeof(netmsg_blank
) )
117 vg_warn( "Discarding message (too small: %d)\n",
122 netmsg_blank
*tmp
= msg
->m_pData
;
123 if( tmp
->inetmsg_id
== k_inetmsg_scores_request
)
125 vg_log( "Recieved score request, sending records. (id: %u)\n",
128 /* Send back current scores */
129 u32 data_size
= sizeof(netmsg_scores_info
) +
130 0*sizeof(struct netmsg_score_record
);
131 netmsg_scores_info
*return_info
= malloc( data_size
);
133 return_info
->inetmsg_id
= k_inetmsg_scores_info
;
134 return_info
->record_count
= 0;
136 SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
137 hSteamNetworkingSockets
, msg
->m_conn
,
138 return_info
, data_size
,
139 k_nSteamNetworkingSend_Reliable
, NULL
);
142 SteamAPI_SteamNetworkingMessage_t_Release( msg
);
147 int main( int argc
, char *argv
[] )
149 steamworks_ensure_txt( "2103940" );
151 signal( SIGINT
, inthandler
);
153 if( !vg_load_steam_symetric_key( "application_key", steam_symetric_key
) )
156 if( !SteamGameServer_Init( 0, 27400, 27401, eServerModeAuthentication
,
159 vg_error( "SteamGameServer_Init failed\n" );
163 void *hSteamGameServer
= SteamAPI_SteamGameServer();
164 SteamAPI_ISteamGameServer_LogOnAnonymous( hSteamGameServer
);
166 SteamAPI_ManualDispatch_Init();
167 HSteamPipe hsteampipe
= SteamGameServer_GetHSteamPipe();
169 //hSteamHTTP = SteamAPI_SteamGameServerHTTP();
170 hSteamNetworkingSockets
=
171 SteamAPI_SteamGameServerNetworkingSockets_SteamAPI();
177 vg_success( "Steamworks API running\n" );
178 steamworks_event_loop( hsteampipe
, handle_steam_callback
);
184 HSteamListenSocket listener
;
185 SteamNetworkingIPAddr localAddr
;
186 SteamAPI_SteamNetworkingIPAddr_Clear( &localAddr
);
187 localAddr
.m_port
= 27402;
189 listener
= SteamAPI_ISteamNetworkingSockets_CreateListenSocketIP(
190 hSteamNetworkingSockets
, &localAddr
, 0, NULL
);
191 client_pollgroup
= SteamAPI_ISteamNetworkingSockets_CreatePollGroup(
192 hSteamNetworkingSockets
);
195 HTTPRequestHandle test_req
= SteamAPI_ISteamHTTP_CreateHTTPRequest(
196 hSteamHTTP
, k_EHTTPMethodGET
,
197 "https://www.harrygodden.com/hello.txt" );
199 steam_async
*call1
= steam_new_async();
201 call1
->p_handler
= recieve_http
;
202 SteamAPI_ISteamHTTP_SendHTTPRequest( hSteamHTTP
, test_req
, &call1
->id
);
207 steamworks_event_loop( hsteampipe
, handle_steam_callback
);
213 SteamAPI_ISteamNetworkingSockets_DestroyPollGroup( hSteamNetworkingSockets
,
215 SteamAPI_ISteamNetworkingSockets_CloseListenSocket(
216 hSteamNetworkingSockets
, listener
);
218 vg_info( "Shutting down\n..." );
219 SteamGameServer_Shutdown();