ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
socket.h
Go to the documentation of this file.
1#pragma once
2
248#include <stdbool.h>
249#include <string.h> // For memcpy used in common.h
250#include <sys/types.h>
251
252// Define ssize_t for Windows - avoid circular include with string.h
253#ifdef _WIN32
254#include <basetsd.h> // For SSIZE_T
255#ifndef _SSIZE_T_DEFINED
256typedef SSIZE_T ssize_t;
257#define _SSIZE_T_DEFINED
258#endif
259#include <winsock2.h>
260#include <ws2tcpip.h> // Includes TCP_NODELAY and other TCP options
262typedef SOCKET socket_t;
264#define INVALID_SOCKET_VALUE INVALID_SOCKET
266typedef int socklen_t;
268typedef unsigned long nfds_t;
269#else
270#include <sys/socket.h>
271#include <netinet/in.h>
272#include <netinet/tcp.h> // For TCP_NODELAY and other TCP options
273#include <arpa/inet.h>
274#include <poll.h>
276typedef int socket_t;
278#define INVALID_SOCKET_VALUE (-1)
279#endif
280
281#include "../common.h"
282
283// ============================================================================
284// Socket Functions
285// ============================================================================
286
297
306void socket_cleanup(void);
307
341socket_t socket_create(const char *name, int domain, int type, int protocol);
342
350int socket_close(socket_t sock);
351
361int socket_bind(socket_t sock, const struct sockaddr *addr, socklen_t addrlen);
362
371int socket_listen(socket_t sock, int backlog);
372
386socket_t socket_accept(socket_t sock, struct sockaddr *addr, socklen_t *addrlen, const char *name);
387
426int socket_connect(socket_t sock, const struct sockaddr *addr, socklen_t addrlen);
427
471ssize_t socket_send(socket_t sock, const void *buf, size_t len, int flags);
472
520ssize_t socket_recv(socket_t sock, void *buf, size_t len, int flags);
521
534ssize_t socket_sendto(socket_t sock, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr,
535 socklen_t addrlen);
536
549ssize_t socket_recvfrom(socket_t sock, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
550
596int socket_setsockopt(socket_t sock, int level, int optname, const void *optval, socklen_t optlen);
597
632int socket_getsockopt(socket_t sock, int level, int optname, void *optval, socklen_t *optlen);
633
646
655int socket_shutdown(socket_t sock, int how);
656
666int socket_getpeername(socket_t sock, struct sockaddr *addr, socklen_t *addrlen);
667
677int socket_getsockname(socket_t sock, struct sockaddr *addr, socklen_t *addrlen);
678
687
696int socket_set_nonblocking(socket_t sock, bool nonblocking);
697
706int socket_set_reuseaddr(socket_t sock, bool reuse);
707
716int socket_set_nodelay(socket_t sock, bool nodelay);
717
726int socket_set_keepalive(socket_t sock, bool keepalive);
727
739int socket_set_keepalive_params(socket_t sock, bool enable, int idle, int interval, int count);
740
750int socket_set_linger(socket_t sock, bool enable, int timeout);
751
767int socket_set_timeout(socket_t sock, uint64_t timeout_ns);
768
778int socket_set_buffer_sizes(socket_t sock, int recv_size, int send_size);
779
791int socket_get_peer_address(socket_t sock, struct sockaddr *addr, socklen_t *addrlen);
792
801
822
829int socket_get_last_error(void);
830
839const char *socket_get_error_string(void);
840
905int socket_poll(struct pollfd *fds, nfds_t nfds, int64_t timeout_ns);
906
918int socket_select(socket_t max_fd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
919
926void socket_fd_zero(fd_set *set);
927
935void socket_fd_set(socket_t sock, fd_set *set);
936
945int socket_fd_isset(socket_t sock, fd_set *set);
946
955
963bool socket_is_valid(socket_t sock);
964
1030
1042
1054
1075
1076// Platform-specific error codes
1077#ifdef _WIN32
1078#define SOCKET_ERROR_WOULDBLOCK WSAEWOULDBLOCK
1079#define SOCKET_ERROR_INPROGRESS WSAEINPROGRESS
1080#define SOCKET_ERROR_AGAIN WSAEWOULDBLOCK
1081#else
1082#define SOCKET_ERROR_WOULDBLOCK EWOULDBLOCK
1083#define SOCKET_ERROR_INPROGRESS EINPROGRESS
1084#define SOCKET_ERROR_AGAIN EAGAIN
1085#endif
1086
1087// Poll structure for Windows compatibility
1088#ifdef _WIN32
1089#ifndef POLLIN
1090#define POLLIN 0x001
1091#define POLLOUT 0x004
1092#define POLLERR 0x008
1093#define POLLHUP 0x010
1094#define POLLNVAL 0x020
1095#endif
1096
1097// Windows 10 SDK already defines pollfd and nfds_t in winsock2.h
1098// Only define them if not available (e.g., older Windows or custom builds)
1099#if !defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)
1100#ifndef HAVE_STRUCT_POLLFD
1101struct pollfd {
1102 socket_t fd;
1103 short events;
1104 short revents;
1105};
1106#endif
1107
1108typedef unsigned long nfds_t;
1109#endif
1110#endif
1111
1114// ============================================================================
1115// Socket Timeout Operations
1116// ============================================================================
1117
1137
1158int platform_socket_connect_timeout(socket_t sock, const struct sockaddr *addr, socklen_t addr_len,
1159 uint64_t timeout_ns);
asciichat_error_t error_code
unsigned long long uint64_t
Definition common.h:59
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:49
void socket_optimize_for_streaming(socket_t sock)
Optimize socket for high-throughput video streaming.
Definition socket.c:37
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 platform_socket_connect_timeout(socket_t sock, const struct sockaddr *addr, socklen_t addr_len, uint64_t timeout_ns)
Connect to remote address with timeout.
int socket_set_nonblocking(socket_t sock, bool nonblocking)
Set socket to non-blocking mode.
int socket_set_timeout(socket_t sock, uint64_t timeout_ns)
Set socket receive and send timeouts.
Definition socket.c:82
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:276
bool socket_is_connection_reset_error(int error_code)
Check if error code indicates connection reset.
int socket_set_timeout_ns(socket_t sock, uint64_t timeout_ns)
Set socket send/receive timeout in nanoseconds.
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 platform_socket_set_timeout(socket_t sock, uint64_t timeout_ns)
Set send/receive timeout for a socket.
int socket_poll(struct pollfd *fds, nfds_t nfds, int64_t timeout_ns)
Poll sockets for events (multiplexed I/O)
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)
bool socket_is_would_block_error(int error_code)
Check if error code indicates "would block" (non-blocking socket would wait)
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_bind(socket_t sock, const struct sockaddr *addr, socklen_t addrlen)
Bind a socket to an address.
bool socket_is_in_progress_error(int error_code)
Check if error indicates operation in progress (non-blocking connect)
ssize_t socket_send(socket_t sock, const void *buf, size_t len, int flags)
Send data on a socket.
bool socket_is_invalid_socket_error(int error_code)
Check if error code indicates a closed/invalid socket.
int socket_getpeername(socket_t sock, struct sockaddr *addr, socklen_t *addrlen)
Get peer address.
int socket_get_last_error(void)
Get last socket error code.
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.
socket_t socket_accept(socket_t sock, struct sockaddr *addr, socklen_t *addrlen, const char *name)
Accept an incoming connection.
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)
socket_t socket_create(const char *name, int domain, int type, int protocol)
Create a new named socket.
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.
int socket_t
ClangTool/LibTooling compatibility shim for stdbool.h.
🔤 String Manipulation and Shell Escaping Utilities