#include <netcode.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <signal.h>
#include <inttypes.h>
static volatile int quit = 0;
void interrupt_handler( int signal )
{
(void) signal;
quit = 1;
}
static uint8_t private_key[NETCODE_KEY_BYTES] = { 0x60, 0x6a, 0xbe, 0x6e, 0xc9, 0x19, 0x10, 0xea,
0x9a, 0x65, 0x62, 0xf6, 0x6f, 0x2b, 0x30, 0xe4,
0x43, 0x71, 0xd6, 0x2c, 0xd1, 0x99, 0x27, 0x26,
0x6b, 0x3c, 0x60, 0xf4, 0xb7, 0x15, 0xab, 0xa1 };
int main( int argc, char ** argv )
{
(void) argc;
(void) argv;
if ( !netcode_init() )
{
printf( "error: failed to initialize netcode.io\n" );
return 1;
}
netcode_log_level( NETCODE_LOG_LEVEL_INFO );
#define TEST_CONNECT_TOKEN_EXPIRY 30
#define TEST_PROTOCOL_ID 0x1122334455667788
double time = 0.0;
double delta_time = 1.0 / 60.0;
printf( "[client/server]\n" );
struct netcode_client_t * client = netcode_client_create( "::", time );
if ( !client )
{
printf( "error: failed to create client\n" );
return 1;
}
struct netcode_server_t * server = netcode_server_create( "[::]:40000", "[::1]:40000", TEST_PROTOCOL_ID, private_key, time );
if ( !server )
{
printf( "error: failed to create server\n" );
return 1;
}
netcode_server_start( server, 1 );
char * server_address = "[::1]:40000";
uint8_t connect_token[NETCODE_CONNECT_TOKEN_BYTES];
uint64_t client_id = 0;
netcode_random_bytes( (uint8_t*) &client_id, 8 );
printf( "client id is %.16" PRIx64 "\n", client_id );
if ( !netcode_generate_connect_token( 1, &server_address, TEST_CONNECT_TOKEN_EXPIRY, client_id, TEST_PROTOCOL_ID, 0, private_key, connect_token ) )
{
printf( "error: failed to generate connect token\n" );
return 1;
}
netcode_client_connect( client, connect_token );
signal( SIGINT, interrupt_handler );
int server_num_packets_received = 0;
int client_num_packets_received = 0;
uint8_t packet_data[NETCODE_MAX_PACKET_SIZE];
int i;
for ( i = 0; i < NETCODE_MAX_PACKET_SIZE; ++i )
packet_data[i] = (uint8_t) i;
while ( !quit )
{
netcode_client_update( client, time );
netcode_server_update( server, time );
if ( netcode_client_state( client ) == NETCODE_CLIENT_STATE_CONNECTED )
{
netcode_client_send_packet( client, packet_data, NETCODE_MAX_PACKET_SIZE );
}
if ( netcode_server_client_connected( server, 0 ) )
{
netcode_server_send_packet( server, 0, packet_data, NETCODE_MAX_PACKET_SIZE );
}
while ( 1 )
{
int packet_bytes;
uint64_t packet_sequence;
void * packet = netcode_client_receive_packet( client, &packet_bytes, &packet_sequence );
if ( !packet )
break;
(void) packet_sequence;
assert( packet_bytes == NETCODE_MAX_PACKET_SIZE );
assert( memcmp( packet, packet_data, NETCODE_MAX_PACKET_SIZE ) == 0 );
client_num_packets_received++;
netcode_client_free_packet( client, packet );
}
while ( 1 )
{
int packet_bytes;
uint64_t packet_sequence;
void * packet = netcode_server_receive_packet( server, 0, &packet_bytes, &packet_sequence );
if ( !packet )
break;
(void) packet_sequence;
assert( packet_bytes == NETCODE_MAX_PACKET_SIZE );
assert( memcmp( packet, packet_data, NETCODE_MAX_PACKET_SIZE ) == 0 );
server_num_packets_received++;
netcode_server_free_packet( server, packet );
}
if ( client_num_packets_received >= 10 && server_num_packets_received >= 10 )
{
if ( netcode_server_client_connected( server, 0 ) )
{
printf( "client and server successfully exchanged packets\n" );
netcode_server_disconnect_client( server, 0 );
}
}
if ( netcode_client_state( client ) <= NETCODE_CLIENT_STATE_DISCONNECTED )
break;
netcode_sleep( delta_time );
time += delta_time;
}
if ( quit )
{
printf( "\nshutting down\n" );
}
netcode_server_destroy( server );
netcode_client_destroy( client );
netcode_term();
return 0;
}