ascii-chat 0.6.0
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
socket.h
Go to the documentation of this file.
1#pragma once
2
28#include <stdbool.h>
29#include <string.h> // For memcpy used in common.h
30#include <sys/types.h>
31#include "platform/util.h" // For ssize_t definition on Windows
32
33#ifdef _WIN32
34#include <winsock2.h>
35#include <ws2tcpip.h>
37typedef SOCKET socket_t;
39#define INVALID_SOCKET_VALUE INVALID_SOCKET
41typedef int socklen_t;
43typedef unsigned long nfds_t;
44#else
45#include <sys/socket.h>
46#include <netinet/in.h>
47#include <arpa/inet.h>
48#include <poll.h>
50typedef int socket_t;
52#define INVALID_SOCKET_VALUE (-1)
53#endif
54
55#include "../common.h"
56
57// ============================================================================
58// Socket Functions
59// ============================================================================
60
71
80void socket_cleanup(void);
81
91socket_t socket_create(int domain, int type, int protocol);
92
101
111int socket_bind(socket_t sock, const struct sockaddr *addr, socklen_t addrlen);
112
121int socket_listen(socket_t sock, int backlog);
122
132socket_t socket_accept(socket_t sock, struct sockaddr *addr, socklen_t *addrlen);
133
143int socket_connect(socket_t sock, const struct sockaddr *addr, socklen_t addrlen);
144
155ssize_t socket_send(socket_t sock, const void *buf, size_t len, int flags);
156
167ssize_t socket_recv(socket_t sock, void *buf, size_t len, int flags);
168
181ssize_t socket_sendto(socket_t sock, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr,
182 socklen_t addrlen);
183
196ssize_t socket_recvfrom(socket_t sock, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
197
209int socket_setsockopt(socket_t sock, int level, int optname, const void *optval, socklen_t optlen);
210
222int socket_getsockopt(socket_t sock, int level, int optname, void *optval, socklen_t *optlen);
223
232int socket_shutdown(socket_t sock, int how);
233
243int socket_getpeername(socket_t sock, struct sockaddr *addr, socklen_t *addrlen);
244
254int socket_getsockname(socket_t sock, struct sockaddr *addr, socklen_t *addrlen);
255
264
273int socket_set_nonblocking(socket_t sock, bool nonblocking);
274
283int socket_set_reuseaddr(socket_t sock, bool reuse);
284
293int socket_set_nodelay(socket_t sock, bool nodelay);
294
303int socket_set_keepalive(socket_t sock, bool keepalive);
304
316int socket_set_keepalive_params(socket_t sock, bool enable, int idle, int interval, int count);
317
327int socket_set_linger(socket_t sock, bool enable, int timeout);
328
344int socket_set_timeout(socket_t sock, uint32_t timeout_ms);
345
355int socket_set_buffer_sizes(socket_t sock, int recv_size, int send_size);
356
368int socket_get_peer_address(socket_t sock, struct sockaddr *addr, socklen_t *addrlen);
369
378
399
407
416const char *socket_get_error_string(void);
417
427int socket_poll(struct pollfd *fds, nfds_t nfds, int timeout);
428
440int socket_select(socket_t max_fd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
441
448void socket_fd_zero(fd_set *set);
449
457void socket_fd_set(socket_t sock, fd_set *set);
458
467int socket_fd_isset(socket_t sock, fd_set *set);
468
477
486
487// Platform-specific error codes
488#ifdef _WIN32
489#define SOCKET_ERROR_WOULDBLOCK WSAEWOULDBLOCK
490#define SOCKET_ERROR_INPROGRESS WSAEINPROGRESS
491#define SOCKET_ERROR_AGAIN WSAEWOULDBLOCK
492#else
493#define SOCKET_ERROR_WOULDBLOCK EWOULDBLOCK
494#define SOCKET_ERROR_INPROGRESS EINPROGRESS
495#define SOCKET_ERROR_AGAIN EAGAIN
496#endif
497
498// Poll structure for Windows compatibility
499#ifdef _WIN32
500#ifndef POLLIN
501#define POLLIN 0x001
502#define POLLOUT 0x004
503#define POLLERR 0x008
504#define POLLHUP 0x010
505#define POLLNVAL 0x020
506#endif
507
508// Windows 10 SDK already defines pollfd and nfds_t in winsock2.h
509// Only define them if not available (e.g., older Windows or custom builds)
510#if !defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)
511#ifndef HAVE_STRUCT_POLLFD
512struct pollfd {
513 socket_t fd;
514 short events;
515 short revents;
516};
517#endif
518
519typedef unsigned long nfds_t;
520#endif
521#endif
522
unsigned int uint32_t
Definition common.h:58
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:46
void socket_optimize_for_streaming(socket_t sock)
Optimize socket for high-throughput video streaming.
Definition socket.c:36
int socket_set_keepalive_params(socket_t sock, bool enable, int idle, int interval, int count)
Set TCP keepalive parameters.
int socket_shutdown(socket_t sock, int how)
Shutdown socket I/O.
ssize_t socket_recv(socket_t sock, void *buf, size_t len, int flags)
Receive data from a socket.
void socket_fd_zero(fd_set *set)
Clear an fd_set.
int socket_set_buffer_sizes(socket_t sock, int recv_size, int send_size)
Set socket buffer sizes.
int socket_get_fd(socket_t sock)
Get the underlying file descriptor (POSIX compatibility)
int socket_set_nonblocking(socket_t sock, bool nonblocking)
Set socket to non-blocking mode.
int socket_setsockopt(socket_t sock, int level, int optname, const void *optval, socklen_t optlen)
Set socket option.
int socket_t
Socket handle type (POSIX: int)
Definition socket.h:50
ssize_t socket_sendto(socket_t sock, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
Send data to a specific address (UDP)
int socket_getsockopt(socket_t sock, int level, int optname, void *optval, socklen_t *optlen)
Get socket option.
int socket_set_nodelay(socket_t sock, bool nodelay)
Set TCP_NODELAY socket option (disable Nagle's algorithm)
bool socket_is_valid(socket_t sock)
Check if a socket handle is valid.
void socket_cleanup(void)
Cleanup socket subsystem.
int socket_set_linger(socket_t sock, bool enable, int timeout)
Set SO_LINGER socket option.
int socket_poll(struct pollfd *fds, nfds_t nfds, int timeout)
Poll sockets for events.
void socket_fd_set(socket_t sock, fd_set *set)
Add a socket to an fd_set.
int socket_set_blocking(socket_t sock)
Set socket to blocking mode.
int socket_get_peer_address(socket_t sock, struct sockaddr *addr, socklen_t *addrlen)
Get peer address (convenience function)
int socket_set_keepalive(socket_t sock, bool keepalive)
Set SO_KEEPALIVE socket option.
int socket_close(socket_t sock)
Close a socket.
int socket_get_error(socket_t sock)
Get socket-specific error code.
int socket_set_timeout(socket_t sock, uint32_t timeout_ms)
Set socket receive and send timeouts.
Definition socket.c:81
int socket_bind(socket_t sock, const struct sockaddr *addr, socklen_t addrlen)
Bind a socket to an address.
ssize_t socket_send(socket_t sock, const void *buf, size_t len, int flags)
Send data on a socket.
int socket_getpeername(socket_t sock, struct sockaddr *addr, socklen_t *addrlen)
Get peer address.
socket_t socket_accept(socket_t sock, struct sockaddr *addr, socklen_t *addrlen)
Accept an incoming connection.
int socket_get_last_error(void)
Get last socket error code.
socket_t socket_create(int domain, int type, int protocol)
Create a new socket.
int socket_select(socket_t max_fd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
Select sockets for I/O readiness.
const char * socket_get_error_string(void)
Get last socket error as string.
int socket_fd_isset(socket_t sock, fd_set *set)
Check if a socket is in an fd_set.
int socket_set_reuseaddr(socket_t sock, bool reuse)
Set SO_REUSEADDR socket option.
asciichat_error_t socket_init(void)
Initialize socket subsystem (required on Windows)
int socket_listen(socket_t sock, int backlog)
Listen for incoming connections.
ssize_t socket_recvfrom(socket_t sock, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
Receive data from a specific address (UDP)
int socket_connect(socket_t sock, const struct sockaddr *addr, socklen_t addrlen)
Connect to a remote address.
int socket_getsockname(socket_t sock, struct sockaddr *addr, socklen_t *addrlen)
Get socket local address.
Public platform utility API for string, memory, and file operations.
🔤 String Manipulation and Shell Escaping Utilities