Files
utun2/lib/socket_compat.h
T
Evgeny 3f1d4077e9 Add cross-platform socket compatibility layer for Windows support
- Add socket_compat.h/c with platform abstraction for POSIX/Windows
- socket_t typedef: int on POSIX, SOCKET on Windows
- Add socket_platform_init/cleanup for WSAStartup on Windows
- Add socket operations: create_udp, sendto, recvfrom, set_nonblocking
- Add socket options: set_buffers, set_reuseaddr, set_mark (Linux), bind_to_device (Linux)
- Update u_async: add socket_t support with uasync_add_socket_t/remove_socket_t
- Update ETCP: use socket_t and socket_compat functions
- Add DEBUG_CATEGORY_SOCKET for socket debugging
- All 22 tests pass on Linux
- MSYS2 UCRT64 compatible
2026-02-15 01:01:35 +03:00

73 lines
1.8 KiB
C

/**
* Socket compatibility layer for cross-platform support (POSIX / Windows)
* MSYS2 UCRT64 compatible
*/
#ifndef SOCKET_COMPAT_H
#define SOCKET_COMPAT_H
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
typedef SOCKET socket_t;
#define SOCKET_INVALID INVALID_SOCKET
#define SOCKET_ERROR_CODE SOCKET_ERROR
// Error codes
#define ERR_WOULDBLOCK WSAEWOULDBLOCK
#define ERR_AGAIN WSAEWOULDBLOCK
#define ERR_INTR WSAEINTR
#else
// POSIX systems
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
typedef int socket_t;
#define SOCKET_INVALID (-1)
#define SOCKET_ERROR_CODE (-1)
#define ERR_WOULDBLOCK EWOULDBLOCK
#define ERR_AGAIN EAGAIN
#define ERR_INTR EINTR
#endif
// Platform initialization/cleanup
int socket_platform_init(void);
void socket_platform_cleanup(void);
// Socket operations
socket_t socket_create_udp(int family);
int socket_set_nonblocking(socket_t sock);
int socket_close_wrapper(socket_t sock);
static inline int socket_get_error(void) {
#ifdef _WIN32
return WSAGetLastError();
#else
return errno;
#endif
}
// Socket options
int socket_set_buffers(socket_t sock, int sndbuf, int rcvbuf);
int socket_set_reuseaddr(socket_t sock, int reuse);
int socket_bind_to_device(socket_t sock, const char* ifname);
int socket_set_mark(socket_t sock, int mark);
// I/O operations
ssize_t socket_sendto(socket_t sock, const void* buf, size_t len,
struct sockaddr* dest, socklen_t dest_len);
ssize_t socket_recvfrom(socket_t sock, void* buf, size_t len,
struct sockaddr* src, socklen_t* src_len);
// Utility
const char* socket_strerror(int err);
#endif // SOCKET_COMPAT_H