ascii-chat 0.8.38
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
transport.c File Reference

Go to the source code of this file.

Data Structures

struct  tcp_transport_data_t
 TCP transport implementation data. More...
 

Functions

acip_transport_t * acip_tcp_transport_create (socket_t sockfd, crypto_context_t *crypto_ctx)
 
void acip_transport_destroy (acip_transport_t *transport)
 

Function Documentation

◆ acip_tcp_transport_create()

acip_transport_t * acip_tcp_transport_create ( socket_t  sockfd,
crypto_context_t *  crypto_ctx 
)

Definition at line 218 of file tcp/transport.c.

218 {
219 if (sockfd == INVALID_SOCKET_VALUE) {
220 SET_ERRNO(ERROR_INVALID_PARAM, "Invalid socket descriptor");
221 return NULL;
222 }
223
224 // Allocate transport structure
225 acip_transport_t *transport = SAFE_MALLOC(sizeof(acip_transport_t), acip_transport_t *);
226 if (!transport) {
227 SET_ERRNO(ERROR_MEMORY, "Failed to allocate TCP transport");
228 return NULL;
229 }
230
231 // Allocate TCP-specific data
232 tcp_transport_data_t *tcp_data = SAFE_MALLOC(sizeof(tcp_transport_data_t), tcp_transport_data_t *);
233 if (!tcp_data) {
234 SAFE_FREE(transport);
235 SET_ERRNO(ERROR_MEMORY, "Failed to allocate TCP transport data");
236 return NULL;
237 }
238
239 // Initialize TCP data
240 tcp_data->sockfd = sockfd;
241 tcp_data->is_connected = true;
242
243 // Enable TCP_NODELAY to disable Nagle's algorithm
244 // This ensures small packets are sent immediately instead of being buffered
245 int nodelay = 1;
246 if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (const char *)&nodelay, sizeof(nodelay)) < 0) {
247 log_warn("Failed to set TCP_NODELAY on socket %d: %s", sockfd, SAFE_STRERROR(errno));
248 // Continue anyway - this is not fatal
249 }
250
251 // Initialize transport
252 transport->methods = &tcp_methods;
253 transport->crypto_ctx = crypto_ctx;
254 transport->impl_data = tcp_data;
255
256 log_debug("Created TCP transport for socket %d (crypto: %s)", sockfd, crypto_ctx ? "enabled" : "disabled");
257
258 return transport;
259}
TCP transport implementation data.
socket_t sockfd
Socket descriptor (NOT owned - don't close)
bool is_connected
Connection state.

References tcp_transport_data_t::is_connected, and tcp_transport_data_t::sockfd.

Referenced by acds_client_handler(), add_client(), connection_attempt_tcp(), crypto_handshake_client_auth_response_socket(), crypto_handshake_client_complete_socket(), crypto_handshake_client_key_exchange_socket(), crypto_handshake_server_auth_challenge_socket(), crypto_handshake_server_complete_socket(), crypto_handshake_server_start_socket(), server_connection_establish(), and server_main().

◆ acip_transport_destroy()

void acip_transport_destroy ( acip_transport_t *  transport)

Definition at line 265 of file tcp/transport.c.

265 {
266 if (!transport) {
267 return;
268 }
269
270 // Close if still connected
271 if (transport->methods && transport->methods->close && transport->methods->is_connected &&
272 transport->methods->is_connected(transport)) {
273 transport->methods->close(transport);
274 }
275
276 // Call custom destroy implementation if provided
277 if (transport->methods && transport->methods->destroy_impl) {
278 transport->methods->destroy_impl(transport);
279 }
280
281 // Free implementation data
282 if (transport->impl_data) {
283 SAFE_FREE(transport->impl_data);
284 }
285
286 // Free transport structure
287 SAFE_FREE(transport);
288
289 log_debug("Destroyed ACIP transport");
290}

Referenced by connection_context_cleanup(), crypto_handshake_client_auth_response_socket(), crypto_handshake_client_complete_socket(), crypto_handshake_client_key_exchange_socket(), crypto_handshake_server_auth_challenge_socket(), crypto_handshake_server_complete_socket(), crypto_handshake_server_start_socket(), remove_client(), server_connection_close(), server_connection_establish(), server_connection_set_transport(), server_main(), and websocket_client_destroy().