ascii-chat 0.8.38
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
Client Main Entry Point

🚀 Main entry point and lifecycle orchestration for the client application More...

Files

file  main.h
 ascii-chat Client Mode Entry Point Header
 

Detailed Description

🚀 Main entry point and lifecycle orchestration for the client application

Client Main Entry Point

Overview

The client main entry point orchestrates the complete client lifecycle including initialization, connection management, reconnection logic, and graceful shutdown.

Implementation: src/client/main.c, src/client/main.h

Responsibilities

  • Command-line argument parsing
  • Platform and subsystem initialization (display, audio, webcam)
  • Connection establishment with exponential backoff
  • Signal handling (SIGINT/Ctrl+C)
  • Main event loop and thread coordination
  • Reconnection orchestration on connection loss
  • Cleanup and resource deallocation

Application Lifecycle

Initialization

// 1. Parse command-line options
options_init(argc, argv, MODE_CLIENT);
// 2. Initialize platform subsystems
if (opt_audio_enabled) audio_client_init();
// 3. Setup signal handlers
signal(SIGINT, sigint_handler);
int audio_client_init()
Initialize audio subsystem.
int capture_init()
Initialize capture subsystem.
int display_init()
Initialize what is necessary to display ascii frames.
asciichat_error_t platform_init(void)
Definition init.c:10
asciichat_error_t options_init(int argc, char **argv)

Connection Loop

int reconnect_attempt = 0;
bool first_connection = true;
while (!should_exit()) {
// Attempt connection with exponential backoff
int result = server_connection_establish(opt_address, opt_port,
reconnect_attempt, first_connection,
has_ever_connected);
if (result == 0 || result == CONNECTION_WARNING_NO_CLIENT_AUTH) {
// Connection successful - start threads
if (opt_audio_enabled) audio_start_thread();
first_connection = false;
has_ever_connected = true;
reconnect_attempt = 0;
// Wait for connection loss or exit signal
platform_sleep_usec(100000); // 100ms poll
}
// Stop all threads
if (opt_audio_enabled) audio_stop_thread();
// Wait for threads to exit
(opt_audio_enabled && !audio_thread_exited())) {
platform_sleep_usec(10000); // 10ms poll
}
// Close connection
if (should_exit()) break; // User requested exit
// Connection lost - prepare for reconnection
log_info("Connection lost - will attempt reconnection");
}
else if (result == CONNECTION_ERROR_AUTH_FAILED ||
// Fatal auth errors - no retry
break;
}
// Exponential backoff with cap at 5 seconds
int delay_ms = 10 + (200 * reconnect_attempt);
if (delay_ms > 5000) delay_ms = 5000;
platform_sleep_usec(delay_ms * 1000);
reconnect_attempt++;
}
@ CONNECTION_ERROR_HOST_KEY_FAILED
Host key verification failed (no retry)
@ CONNECTION_ERROR_AUTH_FAILED
Authentication failure (no retry)
@ CONNECTION_WARNING_NO_CLIENT_AUTH
Server not using client verification (warning)
bool should_exit(void)
Definition main.c:90
void audio_stop_thread()
Stop audio capture thread.
bool audio_thread_exited()
Check if audio capture thread has exited.
int audio_start_thread()
Start audio capture thread.
int capture_start_thread()
Start capture thread.
void capture_stop_thread()
Stop capture thread.
bool capture_thread_exited()
Check if capture thread has exited.
void server_connection_close()
Close the server connection gracefully.
bool server_connection_is_active()
Check if server connection is currently active.
int server_connection_establish(const char *address, int port, int reconnect_attempt, bool first_connection, bool has_ever_connected)
Establish connection to ascii-chat server.
void display_reset_for_new_connection()
Reset display state for new connection.
bool keepalive_thread_exited()
Check if keepalive thread has exited.
Definition keepalive.c:291
int keepalive_start_thread()
Start keepalive/ping thread.
Definition keepalive.c:233
void keepalive_stop_thread()
Stop keepalive/ping thread.
Definition keepalive.c:259
void protocol_stop_connection()
Stop protocol connection handling.
int protocol_start_connection()
Start protocol connection handling.
bool protocol_connection_lost()
Check if connection has been lost.

Cleanup

// Cleanup in reverse initialization order
if (opt_audio_enabled) audio_cleanup();
platform_cleanup();
return exit_code;
void audio_cleanup()
Cleanup audio subsystem.
void capture_cleanup()
Cleanup capture subsystem.
void display_cleanup()
Cleanup display subsystem.

Signal Handling

SIGINT Handler

static void sigint_handler(int sig) {
(void)sig;
signal_exit(); // Sets g_should_exit atomically
}
void signal_exit(void)
Definition main.c:94

Signal Safety:

  • Only sets atomic flag - no complex operations
  • Main loop detects flag and performs graceful shutdown
  • No mutex operations or malloc/free in handler

Exit Codes

  • 0: Success (clean exit or snapshot completed)
  • 1: Configuration/initialization error
  • 2: Connection error (fatal auth failure or max retries)
  • 130: SIGINT received (Ctrl+C)
See also
src/client/main.c
src/client/main.h
Client Overview