## Overview DAP Net Client provides comprehensive client-side functionality for connecting to and interacting with DAP-enabled servers and services. This module implements connection management, protocol handling, authentication, and service discovery, enabling applications to seamlessly integrate with the DAP ecosystem. **Based on:** `dap-sdk/net/client/include/dap_client.h`, `dap-sdk/net/client/src/dap_client.c` ## Document Structure - [[#Overview|Overview]] - [[#Module Structures|Module Structures]] - [[#dap_client_t|dap_client_t - Client Instance]] - [[#dap_client_config_t|dap_client_config_t - Configuration]] - [[#dap_client_connection_t|dap_client_connection_t - Connection Management]] - [[#dap_client_request_t|dap_client_request_t - Request Structure]] - [[#dap_client_auth_t|dap_client_auth_t - Authentication]] - [[#Module Functions|Module Functions]] - [[#Client Management|Client Creation and Configuration]] - [[#Connection Operations|Connection Establishment and Control]] - [[#Communication|Request/Response Handling]] - [[#Authentication|Security and Authentication]] - [[#Error Codes|Error Codes]] - [[#Typical Examples|Typical Examples]] ## Module Structures ### dap_client_t Core client instance structure managing connections and configuration. ```c typedef struct dap_client { struct { char *server_addr; // Server address/hostname uint16_t server_port; // Server port number dap_client_config_t *config; // Client configuration dap_list_t *connections; // Active connections uint32_t connection_count; // Number of connections dap_client_state_t state; // Current client state uint64_t requests_sent; // Total requests sent uint64_t responses_received; // Total responses received } pub; struct { dap_htable_t *connection_table; // Fast connection lookup dap_events_socket_t *event_socket; // Event handling socket dap_timer_t *keepalive_timer; // Connection keepalive dap_client_auth_t *auth_context; // Authentication context bool is_connected; // Connection status uint64_t last_activity; // Last activity timestamp pthread_mutex_t client_mutex; // Thread synchronization void *ssl_context; // SSL/TLS context } priv; } dap_client_t; ``` **Public Fields:** - `server_addr` - Target server address or hostname - `server_port` - Server port number for connection - `config` - Client configuration parameters - `connections` - List of active connections - `connection_count` - Current number of active connections - `state` - Current operational state of the client ### dap_client_config_t Configuration parameters for client operation and behavior. ```c typedef struct dap_client_config { struct { uint32_t connection_timeout_ms; // Connection timeout uint32_t request_timeout_ms; // Request timeout uint32_t max_connections; // Maximum concurrent connections uint32_t keepalive_interval_sec; // Keepalive frequency bool auto_reconnect; // Automatic reconnection uint32_t max_reconnect_attempts; // Reconnection retry limit bool enable_compression; // Enable data compression } pub; struct { uint32_t buffer_size; // I/O buffer size dap_enc_key_type_t encryption_type; // Encryption algorithm uint32_t heartbeat_interval_ms; // Heartbeat frequency bool debug_mode; // Debug logging enabled uint32_t circuit_breaker_threshold; // Circuit breaker failure threshold bool enable_metrics; // Performance metrics collection } priv; } dap_client_config_t; ``` ### dap_client_connection_t Connection management structure for individual server connections. ```c typedef struct dap_client_connection { struct { uint64_t connection_id; // Unique connection identifier dap_events_socket_t *socket; // Connection socket dap_connection_state_t state; // Connection state dap_time_t established_time; // Connection establishment time uint64_t bytes_sent; // Bytes sent on connection uint64_t bytes_received; // Bytes received on connection } pub; struct { dap_client_t *parent_client; // Parent client reference dap_buffer_t *send_buffer; // Send buffer queue dap_buffer_t *receive_buffer; // Receive buffer pthread_mutex_t connection_mutex; // Connection synchronization bool is_persistent; // Persistent connection flag uint32_t error_count; // Connection error counter } priv; } dap_client_connection_t; ``` ### dap_client_request_t Request structure for client-server communication. ```c typedef struct dap_client_request { struct { uint64_t request_id; // Unique request identifier dap_client_request_type_t type; // Request type void *data; // Request data payload size_t data_size; // Size of request data uint32_t timeout_ms; // Request timeout dap_client_priority_t priority; // Request priority } pub; struct { dap_client_connection_t *connection; // Connection for this request dap_client_response_callback_t callback; // Response callback void *callback_context; // Callback context data uint32_t retry_count; // Number of retry attempts bool expects_response; // Response expected flag } priv; } dap_client_request_t; ``` ### dap_client_auth_t Authentication context for secure client connections. ```c typedef struct dap_client_auth { struct { dap_auth_type_t auth_type; // Authentication method char *username; // Username for authentication char *realm; // Authentication realm bool is_authenticated; // Authentication status dap_time_t auth_time; // Authentication timestamp } pub; struct { char *password_hash; // Hashed password dap_pkey_t *private_key; // Private key for auth char *token; // Authentication token uint8_t *credentials; // Encrypted credentials size_t credentials_size; // Size of credentials pthread_mutex_t auth_mutex; // Authentication mutex } priv; } dap_client_auth_t; ``` ## Module Functions ### Client Management #### `dap_client_new()` Creates new DAP client instance with specified server address and port. ```c dap_client_t* dap_client_new(const char *a_server_addr, uint16_t a_server_port); ``` **Parameters:** - `a_server_addr` (const char*) - Server address or hostname to connect to - `a_server_port` (uint16_t) - Server port number for connection **Returns:** - `dap_client_t*` - New client instance ready for configuration - `NULL` - Client creation failed due to invalid parameters or memory allocation **Error Conditions:** - Returns NULL if a_server_addr is NULL or empty - Returns NULL if a_server_port is 0 or invalid - Returns NULL if memory allocation fails **Description:** Creates a new DAP client instance configured for the specified server. The client is created in an unconnected state and requires additional configuration before establishing connections. #### `dap_client_delete()` Destroys client instance and frees all associated resources. ```c void dap_client_delete(dap_client_t *a_client); ``` **Parameters:** - `a_client` (dap_client_t*) - Client instance to destroy **Description:** Safely destroys the client by disconnecting all connections, freeing allocated memory, and cleaning up resources. #### `dap_client_set_config()` Configures client with operational parameters. ```c int dap_client_set_config(dap_client_t *a_client, const dap_client_config_t *a_config); ``` **Parameters:** - `a_client` (dap_client_t*) - Client instance to configure - `a_config` (const dap_client_config_t*) - Configuration parameters **Returns:** - `0` - Configuration applied successfully - `-1` - Invalid client or configuration parameters - `-2` - Configuration validation failed ### Connection Operations #### `dap_client_connect()` Establishes connection to the configured server. ```c int dap_client_connect(dap_client_t *a_client); ``` **Parameters:** - `a_client` (dap_client_t*) - Client instance to connect **Returns:** - `0` - Connection established successfully - `-1` - Invalid client parameter - `-2` - Connection timeout - `-3` - Server unreachable - `-4` - Authentication failed **Error Conditions:** - Returns -1 if a_client is NULL or not properly configured - Returns -2 if connection attempt times out - Returns -3 if server is not reachable or refuses connection - Returns -4 if authentication credentials are invalid **Description:** Establishes a connection to the configured server with full authentication and encryption setup. #### `dap_client_disconnect()` Closes connection to server gracefully. ```c int dap_client_disconnect(dap_client_t *a_client); ``` **Parameters:** - `a_client` (dap_client_t*) - Client instance to disconnect **Returns:** - `0` - Disconnection completed successfully - `-1` - Invalid client parameter - `-2` - Client not connected ### Communication #### `dap_client_send_request()` Sends request to server with response handling. ```c int dap_client_send_request(dap_client_t *a_client, const dap_client_request_t *a_request); ``` **Parameters:** - `a_client` (dap_client_t*) - Client instance - `a_request` (const dap_client_request_t*) - Request to send **Returns:** - `0` - Request sent successfully - `-1` - Invalid parameters - `-2` - Client not connected - `-3` - Send buffer full #### `dap_client_send_data()` Sends raw data to server. ```c ssize_t dap_client_send_data(dap_client_t *a_client, const void *a_data, size_t a_data_size); ``` **Parameters:** - `a_client` (dap_client_t*) - Client instance - `a_data` (const void*) - Data to send - `a_data_size` (size_t) - Size of data in bytes **Returns:** - `>= 0` - Number of bytes sent - `-1` - Send operation failed ### Authentication #### `dap_client_set_auth()` Configures client authentication credentials. ```c int dap_client_set_auth(dap_client_t *a_client, const dap_client_auth_t *a_auth); ``` **Parameters:** - `a_client` (dap_client_t*) - Client instance - `a_auth` (const dap_client_auth_t*) - Authentication credentials **Returns:** - `0` - Authentication configured successfully - `-1` - Invalid parameters - `-2` - Authentication method not supported #### `dap_client_authenticate()` Performs authentication with server. ```c int dap_client_authenticate(dap_client_t *a_client); ``` **Parameters:** - `a_client` (dap_client_t*) - Client instance **Returns:** - `0` - Authentication successful - `-1` - Invalid client parameter - `-2` - Authentication failed ## Error Codes ### DAP Client Error Codes ```c typedef enum dap_client_error { DAP_CLIENT_ERROR_SUCCESS = 0, // Operation successful DAP_CLIENT_ERROR_INVALID_PARAM = -1, // Invalid parameter provided DAP_CLIENT_ERROR_NO_MEMORY = -2, // Memory allocation failed DAP_CLIENT_ERROR_NOT_CONNECTED = -3, // Not connected to server DAP_CLIENT_ERROR_CONNECTION_TIMEOUT = -4, // Connection timeout DAP_CLIENT_ERROR_CONNECTION_FAILED = -5, // Connection establishment failed DAP_CLIENT_ERROR_AUTH_FAILED = -6, // Authentication failed DAP_CLIENT_ERROR_REQUEST_TIMEOUT = -7, // Request timeout DAP_CLIENT_ERROR_SERVER_ERROR = -8, // Server returned error DAP_CLIENT_ERROR_PROTOCOL_ERROR = -9, // Protocol violation DAP_CLIENT_ERROR_ENCRYPTION_FAILED = -10, // Encryption/decryption failed DAP_CLIENT_ERROR_SERVICE_UNAVAILABLE = -11, // Requested service unavailable DAP_CLIENT_ERROR_BUFFER_FULL = -12 // Send/receive buffer full } dap_client_error_t; ``` ## Typical Examples ### Basic Client Connection Example ```c #include "dap_common.h" #include "dap_client.h" int example_client_connection() { log_it(L_INFO, "=== DAP Client Example ==="); // Step 1: Create client instance dap_client_t *client = dap_client_new("127.0.0.1", 8080); if (!client) { log_it(L_ERROR, "✗ Failed to create DAP client"); return -1; } log_it(L_INFO, "✓ DAP client created for server 127.0.0.1:8080"); // Step 2: Configure client dap_client_config_t config = { .pub.connection_timeout_ms = 5000, .pub.request_timeout_ms = 10000, .pub.max_connections = 5, .pub.keepalive_interval_sec = 30, .pub.auto_reconnect = true, .pub.max_reconnect_attempts = 3, .pub.enable_compression = false, .priv.buffer_size = 8192, .priv.encryption_type = DAP_ENC_KEY_TYPE_AES256, .priv.debug_mode = true }; int result = dap_client_set_config(client, &config); if (result != 0) { log_it(L_ERROR, "✗ Failed to configure client: %d", result); dap_client_delete(client); return -1; } log_it(L_INFO, "✓ Client configured successfully"); // Step 3: Connect to server result = dap_client_connect(client); if (result == 0) { log_it(L_INFO, "✓ Connected to server successfully"); } else { log_it(L_ERROR, "✗ Connection failed: %d", result); dap_client_delete(client); return -1; } // Step 4: Send test data const char *test_message = "Hello from DAP client!"; ssize_t bytes_sent = dap_client_send_data(client, test_message, strlen(test_message)); if (bytes_sent > 0) { log_it(L_INFO, "✓ Sent %zd bytes to server", bytes_sent); } else { log_it(L_ERROR, "✗ Failed to send data to server"); } // Step 5: Cleanup dap_client_disconnect(client); dap_client_delete(client); log_it(L_INFO, "✓ DAP Client example completed"); return 0; } ``` ### Authentication Example ```c #include "dap_common.h" #include "dap_client.h" int example_client_authentication() { log_it(L_INFO, "=== DAP Client Authentication Example ==="); // Step 1: Create client dap_client_t *client = dap_client_new("secure.example.com", 443); if (!client) { log_it(L_ERROR, "✗ Failed to create client"); return -1; } // Step 2: Set up authentication dap_client_auth_t auth = { .pub.auth_type = DAP_AUTH_TYPE_PASSWORD, .pub.username = "testuser", .pub.realm = "dap-service" }; int result = dap_client_set_auth(client, &auth); if (result != 0) { log_it(L_ERROR, "✗ Failed to configure authentication: %d", result); dap_client_delete(client); return -1; } log_it(L_INFO, "✓ Authentication configured"); // Step 3: Connect with authentication result = dap_client_connect(client); if (result == 0) { log_it(L_INFO, "✓ Authenticated connection established"); } else { log_it(L_ERROR, "✗ Authentication failed: %d", result); } // Step 4: Cleanup dap_client_delete(client); log_it(L_INFO, "✓ Authentication example completed"); return 0; } ``` --- **See also:** [[Module DAP Net - Server|Module DAP Net - Server]], [[Module DAP Net - Stream|Module DAP Net - Stream]], [[Module DAP IO|Module DAP IO]] --- *Based on: `dap-sdk/net/client/include/dap_client.h`, `dap-sdk/net/client/src/dap_client.c`*