NAME

on_client_timer - event occurs when a timer expires for a connection.

SYNOPSIS

#include <game-carrier/common.h>

typedef void (*OnClientTimer)(GCT_INTPTR conn_user);

typedef struct on_client_timer {
    /* ... Some fields ... */
    OnClientTimer on_client_timer;
    /* ... Some fields ... */
}

Parameters:

  • conn_user GCT_INTPTR User data associated with the connection.

RETURN VALUE

None.

DESCRIPTION

The on_client_timer event is the member of the client_events struct. The on_client_timer event occurs when a connection is established and the timer set using the gc_client_set_timer function has expired.

The conn_user parameter represents the user-defined data that is associated with a connection. This data is passed to all event handlers that are defined in the client_events struct. This parameter allows the user to find their own connection-related data. It could be a pointer to a structure allocated before creation a connection, or an index in some container. If the user has created multiple connections, they could use different conn_user values for each connection and then use that value in the event handlers to determine which connection the event is associated with.

It’s important to note that the timer does not have high resolution and therefore cannot be used for precise timing purposes.

In Passive and Hybrid modes, the on_client_timer event is called in the same thread from gc_clients_service call. While in Active mode, the event may be triggered in an arbitrary thread.

EXAMPLE

#include <game-carrier/client.h>

#include <stdio.h>

#define GAME_CLIENT 1
#define TIMER_DURATION  1000

int mode = GC_MODE_HYBRID;
GCT_INTPTR game_conn;

int finished = 0;

void on_client_connect(GCT_INTPTR conn_user, GCT_INTPTR handle)
{
    if (conn_user == GAME_CLIENT) {
        printf("Connected to the game server\n");
        game_conn = handle;
        gc_client_set_timer(game_conn, TIMER_DURATION);
        return;
    }

    printf("??? Connected to the unknown server\n");
}

void on_client_connection_error(GCT_INTPTR conn_user, GCT_CSTR reason)
{
    ++finished;

    if (conn_user == GAME_CLIENT) {
        fprintf(stderr, "Failed connecting to the game server: %s\n", reason);
        return;
    }

    fprintf(stderr, "??? Failed connecting to the unknown server: %s\n", reason);
}

void on_client_disconnect(GCT_INTPTR conn_user)
{
    ++finished;

    if (conn_user == GAME_CLIENT) {
        printf("Disconnected from the game server.\n");
        return;
    }

    printf("??? Unknown connection has been disconnected from the game server");
}

void on_client_message(
    GCT_INTPTR conn_user, GCT_PTR data, GCT_SIZE len)
{
    if (conn_user == GAME_CLIENT) {
        printf("Received message from the game server: %s\n", (char*)data);
        gc_client_set_timer(game_conn, GC_CANCEL_TIMER);
        gc_client_stop(game_conn);
        return;
    }

    printf("??? Received message from an unknown server: %s\n", (char*)data);
}

void on_client_timer(GCT_INTPTR conn_user)
{
    if (conn_user == GAME_CLIENT) {
        fprintf(stderr, "Timer expired, no answer in time!\n");
        gc_client_stop(game_conn);
        return;
    }

    fprintf(stderr, "??? Timer has expired for an unknown connection\n");
}

int main(int argc, char * argv[])
{
    ClientEvents events;
    events.on_client_connect = on_client_connect;
    events.on_client_connection_error = on_client_connection_error;
    events.on_client_disconnect = on_client_disconnect;
    events.on_client_timer = on_client_timer;

    int ret = gc_clients_init(mode);
    if (ret != 0) {
        fprintf(stderr, "Failed to initialize the Game Carrier client library\n");
        return 1;
    }

    int status = gc_client_start(GAME_CLIENT, GC_PROTOCOL_WSS, "game.example.com", 7681, "game", &events);
    if (status != 0) {
        fprintf(stderr, "Failed to connect to the game server\n");
        return 1;
    }

    // Wait Loop //
    while (finished != 1) {

        // Perform related game activity, like drawing a new frame //
        draw_new_frame();

        // Handling network //
        if (mode == GC_MODE_PASSIVE || mode == GC_MODE_HYBRID) {
            gc_clients_service();
        }
    }

    gc_clients_cleanup();
    return 0;
}

SEE ALSO

gc_client_start, gc_client_set_timer