11#include <source_location>
18#define DIAGNOSTIC_PUSH() _Pragma("GCC diagnostic push")
19#define DIAGNOSTIC_IGNORE(warning) _Pragma(QUOTE(GCC diagnostic ignored warning))
20#define DIAGNOSTIC_POP() _Pragma("GCC diagnostic pop")
22#define DIAGNOSTIC_PUSH()
23#define DIAGNOSTIC_IGNORE(warning)
24#define DIAGNOSTIC_POP()
48#if !defined(WINVER) || (WINVER < _WIN32_WINNT_WINXP)
49#error WINVER must be defined to something equal or above to 0x0501
51#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < _WIN32_WINNT_WINXP)
52#error _WIN32_WINNT must be defined to something equal or above to 0x0501
61#pragma comment(lib, "Ws2_32.lib")
62#pragma comment(lib, "iphlpapi.lib")
75#include <netinet/in.h>
76#include <netinet/tcp.h>
79#include <sys/select.h>
80#include <sys/socket.h>
238 return WSAStartup(MAKEWORD(2, 2), &WSAData);
248 return WSAGetLastError();
254 return closesocket(fd);
257const char*
inet_ntop_aux(
int af,
const void* src,
char* dst, socklen_t size);
259#define JSOCKETPP_TIMEOUT_CODE WSAETIMEDOUT
268#define JSOCKETPP_TIMEOUT_CODE ETIMEDOUT
289 return ioctl(fd,
static_cast<unsigned long>(cmd), argp);
562 return IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr);
582 addr4.sin_family = AF_INET;
583 addr4.sin_port = addr6.sin6_port;
584 std::memcpy(&addr4.sin_addr.s_addr, addr6.sin6_addr.s6_addr + 12,
sizeof(addr4.sin_addr.s_addr));
601std::string
ipFromSockaddr(
const sockaddr* addr,
bool convertIPv4Mapped =
true);
947 const int socktype,
const int protocol,
const int flags = 0)
950 hints.ai_family = family;
951 hints.ai_socktype = socktype;
952 hints.ai_protocol = protocol;
953 hints.ai_flags = flags;
955 const std::string portStr = std::to_string(port);
958 const std::string hostStr = host.empty() ? std::string{} : std::string(host);
959 const char* hostC = hostStr.empty() ? nullptr : hostStr.c_str();
961 addrinfo* raw =
nullptr;
962 if (
const int ret = ::getaddrinfo(hostC, portStr.c_str(), &hints, &raw); ret != 0)
1056[[nodiscard]]
bool ipAddressesEqual(
const std::string& ip1,
const std::string& ip2);
1160void sendExactTo(
SOCKET fd,
const void* data, std::size_t size,
const sockaddr* addr, socklen_t addrLen,
1161 void (*afterSuccess)(
void* ctx),
void* ctx);
1284 return (
ioctlsocket(fd, FIONREAD, &pending) == 0 && pending > 0) ?
static_cast<std::size_t
>(pending) : 0;
1287 if (ioctl(fd, FIONREAD, &pending) == 0 && pending > 0)
1288 return static_cast<std::size_t
>(pending);
1291 sockaddr_storage tmp{};
1292 socklen_t tmpLen =
static_cast<socklen_t
>(
sizeof(tmp));
1293 const ssize_t peekN = ::recvfrom(fd,
nullptr, 0, MSG_PEEK | MSG_TRUNC,
reinterpret_cast<sockaddr*
>(&tmp), &tmpLen);
1294 return (peekN > 0) ?
static_cast<std::size_t
>(peekN) : 0;
1323 return ::recvfrom(fd,
reinterpret_cast<char*
>(dst.data()),
1325 static_cast<int>(dst.size()),
1329 flags,
reinterpret_cast<sockaddr*
>(src), srcLen);
1332 return ::recv(fd,
reinterpret_cast<char*
>(dst.data()),
1334 static_cast<int>(dst.size()),
1378[[noreturn]]
inline void throwLastSockError(
const std::source_location& loc = std::source_location::current())
1381#if JSOCKETPP_INCLUDE_ERROR_CONTEXT
1384 .append(loc.file_name())
1386 .append(std::to_string(loc.line()))
1388 .append(loc.function_name())
1420 char hostBuf[NI_MAXHOST]{};
1421 char servBuf[NI_MAXSERV]{};
1423 int flags = NI_NUMERICHOST | NI_NUMERICSERV;
1424#ifdef NI_NUMERICSCOPE
1425 flags |= NI_NUMERICSCOPE;
1428 if (
const int ret = ::getnameinfo(sa, len, hostBuf,
sizeof(hostBuf), servBuf,
sizeof(servBuf), flags); ret != 0)
1434 const auto raw = std::strtoul(servBuf,
nullptr, 10);
1435 if (raw >
static_cast<unsigned long>((std::numeric_limits<Port>::max)()))
1438 host.assign(hostBuf);
1439 port =
static_cast<Port>(raw);
Exception class for socket-related errors in jsocketpp.
Represents socket-related errors in the jsocketpp library.
Definition SocketException.hpp:63
constexpr std::size_t MaxUdpPayloadIPv6
Theoretical maximum UDP payload size (in bytes) over IPv6.
Definition common.hpp:542
std::uint16_t Port
Type alias representing a TCP or UDP port number (1–65535).
Definition common.hpp:392
constexpr std::size_t MaxDatagramPayloadSafe
Maximum UDP payload size (in bytes) that is safely valid across common stacks.
Definition common.hpp:513
constexpr std::size_t DefaultDatagramReceiveSize
Fallback receive size (in bytes) for UDP datagrams when the exact size is unknown.
Definition common.hpp:485
sockaddr_in convertIPv4MappedIPv6ToIPv4(const sockaddr_in6 &addr6)
Converts an IPv4-mapped IPv6 address to a pure IPv4 sockaddr_in.
Definition common.hpp:579
constexpr std::size_t MaxUdpPayloadIPv4
Maximum UDP payload size (in bytes) over IPv4.
Definition common.hpp:525
bool isIPv4MappedIPv6(const sockaddr_in6 *addr6)
Checks if a given sockaddr_in6 represents an IPv4-mapped IPv6 address.
Definition common.hpp:560
void resolveNumericHostPort(const sockaddr *sa, const socklen_t len, std::string &host, Port &port)
Resolve numeric host and port from a socket address.
Definition common.hpp:1418
constexpr std::size_t DefaultBufferSize
Default internal buffer size (in bytes) for socket read operations.
Definition common.hpp:434
std::string getBoundLocalIp(SOCKET sockFd)
Retrieves the local IP address to which the socket is currently bound.
Definition common.cpp:370
bool tryCloseNoexcept(const SOCKET fd) noexcept
Attempts to close a socket descriptor without throwing exceptions.
Definition common.hpp:1198
std::unique_ptr< addrinfo, AddrinfoDeleter > AddrinfoPtr
Smart pointer that manages addrinfo* resources using AddrinfoDeleter.
Definition common.hpp:819
void sendExactTo(SOCKET fd, const void *data, std::size_t size, const sockaddr *addr, socklen_t addrLen, void(*afterSuccess)(void *ctx), void *ctx)
Sends an entire datagram to a specific destination using sendto().
Definition common.cpp:505
void sendExact(SOCKET fd, const void *data, std::size_t size)
Sends an entire datagram to a connected peer using send().
Definition common.cpp:477
void closeOrThrow(const SOCKET fd)
Closes a socket descriptor and throws on failure.
Definition common.hpp:1244
AddrinfoPtr resolveAddress(const std::string_view host, const Port port, const int family, const int socktype, const int protocol, const int flags=0)
Resolves a hostname and port into a list of usable socket address structures.
Definition common.hpp:946
void stringToAddress(const std::string &str, sockaddr_storage &addr)
Parses an "IP:port" string into a sockaddr_storage structure.
Definition common.cpp:460
std::string addressToString(const sockaddr_storage &addr)
Converts a socket address to a human-readable "IP:port" string.
Definition common.cpp:423
Implementation-only utilities and platform abstractions for jsocketpp.
Definition BufferView.hpp:52
std::size_t nextDatagramSize(SOCKET fd) noexcept
Query the exact size of the next UDP datagram, if the platform can provide it.
Definition common.hpp:1280
ssize_t recvInto(const SOCKET fd, std::span< std::byte > dst, const int flags, sockaddr_storage *src, socklen_t *srcLen)
Receive into a caller-provided span, routing to recv() or recvfrom() as needed.
Definition common.hpp:1318
void throwLastSockError(const std::source_location &loc=std::source_location::current())
Throw a SocketException for the last socket error, with optional source-location context.
Definition common.hpp:1378
bool ipAddressesEqual(const std::string &ip1, const std::string &ip2)
Compares two IP addresses for logical equality, accounting for IPv4-mapped IPv6 forms.
Definition common.cpp:392
Endianness utilities for network byte order conversion.
uint16_t toNetwork(const uint16_t val)
Converts a 16-bit unsigned integer from host to network byte order.
Definition common.hpp:728
uint16_t fromNetwork(const uint16_t val)
Converts a 16-bit unsigned integer from network to host byte order.
Definition common.hpp:744
A C++ socket library providing Java-style networking interfaces.
Definition BufferView.hpp:16
int CleanupSockets()
Definition common.hpp:241
std::vector< std::string > getHostAddr()
Get all local network interface addresses as strings.
Definition common.cpp:170
ShutdownMode
Enum for socket shutdown modes.
Definition common.hpp:369
@ Write
Shutdown write operations (SHUT_WR or SD_SEND).
Definition common.hpp:371
@ Both
Shutdown both read and write operations (SHUT_RDWR or SD_BOTH).
Definition common.hpp:372
@ Read
Shutdown read operations (SHUT_RD or SD_RECEIVE).
Definition common.hpp:370
int CloseSocket(SOCKET fd)
Definition common.hpp:252
std::string ipFromSockaddr(const sockaddr *addr, bool convertIPv4Mapped=true)
Extracts a human-readable IP address from a socket address structure.
Definition common.cpp:317
std::string SocketErrorMessage(int error, bool gaiStrerror=false)
Convert a socket-related error code to a human-readable message.
Definition common.cpp:5
constexpr SOCKET INVALID_SOCKET
Definition common.hpp:264
const char * inet_ntop_aux(int af, const void *src, char *dst, socklen_t size)
Definition common.cpp:126
Port portFromSockaddr(const sockaddr *addr)
Extracts the port number from a socket address structure.
Definition common.cpp:355
int ioctlsocket(const SOCKET fd, const long cmd, u_long *argp)
Definition common.hpp:287
sockaddr_un SOCKADDR_UN
Definition common.hpp:266
int GetSocketError()
Definition common.hpp:246
int SOCKET
Definition common.hpp:263
constexpr SOCKET SOCKET_ERROR
Definition common.hpp:265
int InitSockets()
Definition common.hpp:235
long ssize_t
Definition common.hpp:233
Custom deleter for addrinfo* pointers to support RAII-style cleanup.
Definition common.hpp:784
void operator()(addrinfo *p) const noexcept
Deletes an addrinfo* by calling freeaddrinfo().
Definition common.hpp:789