Exemple #1
0
int ConnectMain( int argc, char * argv[] )
{
    (void)argc;
    (void)argv;

    Allocator & allocator = GetDefaultAllocator();

    uint64_t clientId = 0;
    RandomBytes( (uint8_t*) &clientId, 8 );

    printf( "\nclient id is %.16" PRIx64 "\n", clientId );

    Matcher matcher( allocator );

    if ( !matcher.Initialize() )
    {
        printf( "error: failed to initialize matcher\n" );
        return 1;
    }

    matcher.RequestMatch( ProtocolId, clientId );

    if ( matcher.GetStatus() == MATCHER_FAILED )
    {
        printf( "\nerror: request match failed. is the matcher running?\n\n" );
        return 1;
    }

    printf( "requesting match from https://localhost:8080\n" );

    MatchResponse matchResponse;

    matcher.GetMatchResponse( matchResponse );

    if ( matchResponse.numServerAddresses == 0 )
    {
        printf( "error: could not find a match\n" );
        return 1;
    }

    printf( "received match response\n" );

    ClientServerPacketFactory packetFactory;

    GameNetworkTransport clientTransport( packetFactory );

    if ( clientTransport.GetError() != SOCKET_ERROR_NONE )
    {
        printf( "error: failed to initialize client socket\n" );
        return 1;
    }
    
    printf( "client started on port %d\n", clientTransport.GetAddress().GetPort() );

    GameClient client( GetDefaultAllocator(), clientTransport );

    client.Connect( matchResponse.serverAddresses[0],
                    matchResponse.connectTokenData, 
                    matchResponse.connectTokenNonce, 
                    matchResponse.clientToServerKey,
                    matchResponse.serverToClientKey );

    double time = 0.0;

    const double deltaTime = 0.1;

    signal( SIGINT, interrupt_handler );    

    while ( !quit )
    {
        client.SendPackets();

        clientTransport.WritePackets();

        clientTransport.ReadPackets();

        client.ReceivePackets();

        client.CheckForTimeOut();

        if ( client.IsDisconnected() )
            break;

        time += deltaTime;

        client.AdvanceTime( time );

        clientTransport.AdvanceTime( time );

        if ( client.ConnectionFailed() )
            break;

        platform_sleep( deltaTime );
    }

    if ( quit )
        printf( "\nclient stopped\n" );

    printf( "\n" );

    if ( client.IsConnected() )
        client.Disconnect();

    return 0;
}
int ClientServerMain()
{
    LocalMatcher matcher;

    uint64_t clientId = 1;

    uint8_t connectTokenData[ConnectTokenBytes];
    uint8_t connectTokenNonce[NonceBytes];

    uint8_t clientToServerKey[KeyBytes];
    uint8_t serverToClientKey[KeyBytes];

    int numServerAddresses;
    Address serverAddresses[MaxServersPerConnectToken];

    memset( connectTokenNonce, 0, NonceBytes );

    if ( !matcher.RequestMatch( clientId, connectTokenData, connectTokenNonce, clientToServerKey, serverToClientKey, numServerAddresses, serverAddresses ) )
    {
        printf( "error: request match failed\n" );
        return 1;
    }

    ClientServerPacketFactory packetFactory;

    Address clientAddress( "::1", ClientPort );
    Address serverAddress( "::1", ServerPort );

    GameNetworkTransport clientTransport( packetFactory, clientAddress );
    GameNetworkTransport serverTransport( packetFactory, serverAddress );

    if ( clientTransport.GetError() != SOCKET_ERROR_NONE || serverTransport.GetError() != SOCKET_ERROR_NONE )
    {
        printf( "error: failed to initialize sockets\n" );
        return 1;
    }
    
    const int NumIterations = 20;

    double time = 0.0;

    GameClient client( GetDefaultAllocator(), clientTransport );

    GameServer server( GetDefaultAllocator(), serverTransport );

    server.SetServerAddress( serverAddress );

    server.Start();
    
    client.Connect( serverAddress, connectTokenData, connectTokenNonce, clientToServerKey, serverToClientKey );

    for ( int i = 0; i < NumIterations; ++i )
    {
        client.SendPackets();
        server.SendPackets();

        clientTransport.WritePackets();
        serverTransport.WritePackets();

        clientTransport.ReadPackets();
        serverTransport.ReadPackets();

        client.ReceivePackets();
        server.ReceivePackets();

        client.CheckForTimeOut();
        server.CheckForTimeOut();

        if ( client.ConnectionFailed() )
        {
            printf( "error: client connect failed!\n" );
            break;
        }

        if ( client.IsConnected() && server.GetNumConnectedClients() == 1 )
            client.Disconnect();

        time += 0.1f;

        if ( !client.IsConnecting() && !client.IsConnected() && server.GetNumConnectedClients() == 0 )
            break;

        client.AdvanceTime( time );
        server.AdvanceTime( time );

        clientTransport.AdvanceTime( time );
        serverTransport.AdvanceTime( time );
    }

    client.Disconnect();

    server.Stop();

    return 0;
}