ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
socket.h
Go to the documentation of this file.
1#pragma once
2#include <libplatform/socket.h>
3
4#if 0
5
250
251#include <stdbool.h>
252#include <string.h> // For memcpy used in common.h
253#include <sys/types.h>
254
255// Define ssize_t for Windows - avoid circular include with string.h
256#ifdef _WIN32
257#include <basetsd.h> // For SSIZE_T
258#ifndef _SSIZE_T_DEFINED
259typedef SSIZE_T ssize_t;
260#define _SSIZE_T_DEFINED
261#endif
262#include <winsock2.h>
263#include <ws2tcpip.h> // Includes TCP_NODELAY and other TCP options
265typedef SOCKET socket_t;
267#define INVALID_SOCKET_VALUE INVALID_SOCKET
269typedef int socklen_t;
271typedef unsigned long nfds_t;
272#else
273#include <sys/socket.h>
274#include <netinet/in.h>
275#include <netinet/tcp.h> // For TCP_NODELAY and other TCP options
276#include <arpa/inet.h>
277#include <poll.h>
279typedef int socket_t;
281#define INVALID_SOCKET_VALUE (-1)
282#endif
283
284#include "../common.h"
285
286// ============================================================================
287// Socket Functions
288// ============================================================================
289
299asciichat_error_t socket_init(void);
300
309void socket_cleanup(void);
310
344socket_t socket_create(const char *name, int domain, int type, int protocol);
345
353int socket_close(socket_t sock);
354
364int socket_bind(socket_t sock, const struct sockaddr *addr, socklen_t addrlen);
365
374int socket_listen(socket_t sock, int backlog);
375
389socket_t socket_accept(socket_t sock, struct sockaddr *addr, socklen_t *addrlen, const char *name);
390
429int socket_connect(socket_t sock, const struct sockaddr *addr, socklen_t addrlen);
430
475#define SOCKET_IOV_MAX 16
476#define SOCKET_ZEROCOPY_THRESHOLD (64 * 1024)
480#define SOCKET_STREAM_SEND_BUFFER (64U * 1024U)
481#define SOCKET_STREAM_SEND_RESERVE (2U * SOCKET_STREAM_SEND_BUFFER)
482
483#define SOCKET_SEND_BUFFER_MAX (32 * 1024 * 1024)
484typedef struct {
485 const void *data;
486 size_t len;
487} socket_buffer_t;
488
492asciichat_error_t socket_sendv(socket_t sock, const socket_buffer_t *buffers, size_t count, size_t *sent);
496asciichat_error_t socket_sendv_all(socket_t sock, const socket_buffer_t *buffers, size_t count, uint64_t timeout_ns);
497
499typedef struct {
500 uint64_t send_calls;
501 uint64_t sent_bytes;
502 uint64_t zerocopy_calls;
503 uint64_t zerocopy_completions;
504 uint64_t zerocopy_copied;
505} socket_io_stats_t;
506socket_io_stats_t socket_io_stats_get(void);
507void socket_io_stats_reset(void);
508
514typedef struct {
515 void *data;
516 size_t capacity;
517 bool mapped;
518 buffer_budget_t budget;
519} socket_send_buffer_t;
520asciichat_error_t socket_send_buffer_alloc(size_t capacity, socket_send_buffer_t *buffer);
521void socket_send_buffer_free(socket_send_buffer_t *buffer);
522
527asciichat_error_t socket_send_zerocopy(socket_t sock, const socket_send_buffer_t *buffer, size_t len,
528 uint64_t timeout_ns, bool *supported, bool *copied);
529
536asciichat_error_t socket_zerocopy_try(socket_t, const socket_send_buffer_t *, size_t offset, size_t length,
537 size_t *sent, bool *supported);
538asciichat_error_t socket_zerocopy_poll(socket_t, bool *completed, bool *copied);
539
540ssize_t socket_send(socket_t sock, const void *buf, size_t len, int flags);
541
589ssize_t socket_recv(socket_t sock, void *buf, size_t len, int flags);
590
603ssize_t socket_sendto(socket_t sock, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr,
604 socklen_t addrlen);
605
618ssize_t socket_recvfrom(socket_t sock, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
619
665int socket_setsockopt(socket_t sock, int level, int optname, const void *optval, socklen_t optlen);
666
701int socket_getsockopt(socket_t sock, int level, int optname, void *optval, socklen_t *optlen);
702
714int socket_set_timeout_ns(socket_t sock, uint64_t timeout_ns);
715
724int socket_shutdown(socket_t sock, int how);
725
735int socket_getpeername(socket_t sock, struct sockaddr *addr, socklen_t *addrlen);
736
746int socket_getsockname(socket_t sock, struct sockaddr *addr, socklen_t *addrlen);
747
755int socket_set_blocking(socket_t sock);
756
765int socket_set_nonblocking(socket_t sock, bool nonblocking);
766
775int socket_set_reuseaddr(socket_t sock, bool reuse);
776
785int socket_set_nodelay(socket_t sock, bool nodelay);
786
795int socket_set_keepalive(socket_t sock, bool keepalive);
796
808int socket_set_keepalive_params(socket_t sock, bool enable, int idle, int interval, int count);
809
819int socket_set_linger(socket_t sock, bool enable, int timeout);
820
836int socket_set_timeout(socket_t sock, uint64_t timeout_ns);
837
847int socket_set_buffer_sizes(socket_t sock, int recv_size, int send_size);
848
860int socket_get_peer_address(socket_t sock, struct sockaddr *addr, socklen_t *addrlen);
861
869int socket_get_error(socket_t sock);
870
890void socket_optimize_for_streaming(socket_t sock);
891
898int socket_get_last_error(void);
899
908const char *socket_get_error_string(void);
909
974int socket_poll(struct pollfd *fds, nfds_t nfds, int64_t timeout_ns);
975
987int socket_select(socket_t max_fd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
988
995void socket_fd_zero(fd_set *set);
996
1004void socket_fd_set(socket_t sock, fd_set *set);
1005
1014int socket_fd_isset(socket_t sock, fd_set *set);
1015
1023int socket_get_fd(socket_t sock);
1024
1032bool socket_is_valid(socket_t sock);
1033
1098bool socket_is_would_block_error(int error_code);
1099
1110bool socket_is_connection_reset_error(int error_code);
1111
1122bool socket_is_invalid_socket_error(int error_code);
1123
1143bool socket_is_in_progress_error(int error_code);
1144
1145// Platform-specific error codes
1146#ifdef _WIN32
1147#define SOCKET_ERROR_WOULDBLOCK WSAEWOULDBLOCK
1148#define SOCKET_ERROR_INPROGRESS WSAEINPROGRESS
1149#define SOCKET_ERROR_AGAIN WSAEWOULDBLOCK
1150#else
1151#define SOCKET_ERROR_WOULDBLOCK EWOULDBLOCK
1152#define SOCKET_ERROR_INPROGRESS EINPROGRESS
1153#define SOCKET_ERROR_AGAIN EAGAIN
1154#endif
1155
1156// Poll structure for Windows compatibility
1157#ifdef _WIN32
1158#ifndef POLLIN
1159#define POLLIN 0x001
1160#define POLLOUT 0x004
1161#define POLLERR 0x008
1162#define POLLHUP 0x010
1163#define POLLNVAL 0x020
1164#endif
1165
1166// Windows 10 SDK already defines pollfd and nfds_t in winsock2.h
1167// Only define them if not available (e.g., older Windows or custom builds)
1168#if !defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)
1169#ifndef HAVE_STRUCT_POLLFD
1170struct pollfd {
1171 socket_t fd;
1172 short events;
1173 short revents;
1174};
1175#endif
1176
1177typedef unsigned long nfds_t;
1178#endif
1179#endif
1180
1182
1183// ============================================================================
1184// Socket Timeout Operations
1185// ============================================================================
1186
1205int platform_socket_set_timeout(socket_t sock, uint64_t timeout_ns);
1206
1227int platform_socket_connect_timeout(socket_t sock, const struct sockaddr *addr, socklen_t addr_len,
1228 uint64_t timeout_ns);
1229
1230#endif
⚙️ Common definitions, error codes, macros, and types shared throughout the application
unsigned long long uint64_t
Definition common.h:63
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
int socket_t
🔤 String Manipulation and Shell Escaping Utilities
Owns the temporary storage used by buffer budget. The data pointers and size or cursor fields describ...
Definition budget.h:8