55#if defined(OS_WINDOWS)
66# include <winsock2.h>
77# include <ws2tcpip.h> // for socklen_t
8- #elif defined(OS_LINUX)
8+ #elif defined(OS_LINUX) or defined(OS_MACOS)
99# include <sys/socket.h>
1010# include <netinet/in.h>
1111# include <arpa/inet.h>
@@ -63,7 +63,7 @@ export namespace CppUtils::Network
6363
6464#if defined(OS_WINDOWS)
6565 inline constexpr auto throwErrno = std::addressof(WindowsSocketApi::throwErrno);
66- #elif defined(OS_LINUX)
66+ #elif defined(OS_LINUX) or defined(OS_MACOS)
6767 inline constexpr auto throwErrno = std::addressof(System::throwErrno);
6868#endif
6969
@@ -72,15 +72,15 @@ export namespace CppUtils::Network
7272 public:
7373#if defined(OS_WINDOWS)
7474 using NativeSocket = SOCKET;
75- #elif defined(OS_LINUX)
75+ #elif defined(OS_LINUX) or defined(OS_MACOS)
7676 using NativeSocket = int;
7777#endif
7878
7979 enum class Domain : int
8080 {
8181 IPV4 = AF_INET,
8282 IPV6 = AF_INET6,
83- #if defined(OS_LINUX)
83+ #if defined(OS_LINUX) or defined(OS_MACOS)
8484 Local = AF_UNIX
8585#endif
8686 };
@@ -101,7 +101,7 @@ export namespace CppUtils::Network
101101 m_socket = ::socket(static_cast<int>(domain), static_cast<int>(type), 0);
102102 if (m_socket == INVALID_SOCKET)
103103 throw std::runtime_error{"Socket creation failed"};
104- #elif defined(OS_LINUX)
104+ #elif defined(OS_LINUX) or defined(OS_MACOS)
105105 m_socket = ::socket(static_cast<int>(domain), static_cast<int>(type), 0);
106106 if (m_socket < 0)
107107 throw std::runtime_error{"Socket creation failed"};
@@ -112,7 +112,7 @@ export namespace CppUtils::Network
112112 explicit inline Socket(SOCKET socket) noexcept:
113113 m_socket{socket}
114114 {}
115- #elif defined(OS_LINUX)
115+ #elif defined(OS_LINUX) or defined(OS_MACOS)
116116 explicit inline Socket(int socket) noexcept:
117117 m_socket{socket}
118118 {}
@@ -127,7 +127,7 @@ export namespace CppUtils::Network
127127 {
128128#if defined(OS_WINDOWS)
129129 other.m_socket = INVALID_SOCKET;
130- #else
130+ #elif defined(OS_LINUX) or defined(OS_MACOS)
131131 other.m_socket = -1;
132132#endif
133133 }
@@ -141,7 +141,7 @@ export namespace CppUtils::Network
141141#if defined(OS_WINDOWS)
142142 if (m_socket != INVALID_SOCKET)
143143 ::closesocket(m_socket);
144- #else
144+ #elif defined(OS_LINUX) or defined(OS_MACOS)
145145 if (m_socket != -1)
146146 ::close(m_socket);
147147#endif
@@ -150,7 +150,7 @@ export namespace CppUtils::Network
150150 m_socket = other.m_socket;
151151#if defined(OS_WINDOWS)
152152 other.m_socket = INVALID_SOCKET;
153- #else
153+ #elif defined(OS_LINUX) or defined(OS_MACOS)
154154 other.m_socket = -1;
155155#endif
156156 }
@@ -162,7 +162,7 @@ export namespace CppUtils::Network
162162#if defined(OS_WINDOWS)
163163 if (m_socket != INVALID_SOCKET)
164164 ::closesocket(m_socket);
165- #elif defined(OS_LINUX)
165+ #elif defined(OS_LINUX) or defined(OS_MACOS)
166166 if (m_socket != -1)
167167 ::close(m_socket);
168168#endif
@@ -195,7 +195,7 @@ export namespace CppUtils::Network
195195 auto mode = enable ? u_long{0} : u_long{1};
196196 if (::ioctlsocket(m_socket, static_cast<long>(FIONBIO), std::addressof(mode)) != 0)
197197 throw std::runtime_error{"CppUtils::Network::Socket::setBlocking: Failed to set blocking mode"};
198- #elif defined(OS_LINUX)
198+ #elif defined(OS_LINUX) or defined(OS_MACOS)
199199 auto flags = ::fcntl(m_socket, F_GETFL);
200200 if (flags == -1)
201201 throw std::runtime_error{"CppUtils::Network::Socket::setBlocking: Failed to get socket flags"};
@@ -214,7 +214,7 @@ export namespace CppUtils::Network
214214 auto mode = u_long{};
215215 ::ioctlsocket(m_socket, static_cast<long>(FIONBIO), std::addressof(mode));
216216 return mode == 0;
217- #elif defined(OS_LINUX)
217+ #elif defined(OS_LINUX) or defined(OS_MACOS)
218218 int flags = ::fcntl(m_socket, F_GETFL, 0);
219219 if (flags == -1)
220220 throw std::runtime_error{"CppUtils::Network::Socket::isBlocking: Failed to get socket flags"};
@@ -237,7 +237,7 @@ export namespace CppUtils::Network
237237 // TODO make implementation for windows
238238 // @see https://stackoverflow.com/questions/72759272/how-to-deal-with-socket-in-select-method
239239 auto result = -1;
240- #else
240+ #elif defined(OS_LINUX) or defined(OS_MACOS)
241241 auto result = select(m_socket + 1, std::addressof(readSet), nullptr, nullptr, std::addressof(timeValue));
242242#endif
243243 if (result < 0)
@@ -250,7 +250,7 @@ export namespace CppUtils::Network
250250 {
251251#if defined(OS_WINDOWS)
252252 return not ::setsockopt(socket, level, option, reinterpret_cast<const char*>(value), static_cast<int>(valueSize));
253- #else
253+ #elif defined(OS_LINUX) or defined(OS_MACOS)
254254 return not ::setsockopt(socket, level, option, value, static_cast<socklen_t>(valueSize));
255255#endif
256256 }
@@ -306,7 +306,7 @@ export namespace CppUtils::Network
306306 {
307307#ifdef OS_WINDOWS
308308 if (::send(m_socket, std::bit_cast<const char*>(std::addressof(data)), sizeof(decltype(data)), 0) < 0)
309- #else
309+ #elif defined(OS_LINUX) or defined(OS_MACOS)
310310 if (::send(m_socket, std::bit_cast<const void*>(std::addressof(data)), sizeof(decltype(data)), 0) < 0)
311311#endif
312312 throw std::runtime_error{"CppUtils::Network::Socket::send: Send failed"};
@@ -317,14 +317,14 @@ export namespace CppUtils::Network
317317 for (auto totalSent = 0uz; totalSent < std::size(data);)
318318#ifdef OS_WINDOWS
319319 if (auto bytesSent = ::send(m_socket, std::bit_cast<const char*>(std::data(data)) + totalSent, static_cast<int>(std::size(data) - totalSent), 0);
320- #else
320+ #elif defined(OS_LINUX) or defined(OS_MACOS)
321321 if (auto bytesSent = ::send(m_socket, std::data(data) + totalSent, std::size(data) - totalSent, 0);
322322#endif
323323 bytesSent < 0)
324324 {
325325#if defined(OS_WINDOWS)
326326 if (::WSAGetLastError() == WSAEWOULDBLOCK)
327- #else
327+ #elif defined(OS_LINUX) or defined(OS_MACOS)
328328 if (errno == EAGAIN or errno == EWOULDBLOCK)
329329#endif
330330 continue;
@@ -338,7 +338,7 @@ export namespace CppUtils::Network
338338 {
339339#if defined(OS_WINDOWS)
340340 if (::send(m_socket, std::data(string), static_cast<int>(std::size(string)), 0) < 0)
341- #else
341+ #elif defined(OS_LINUX) or defined(OS_MACOS)
342342 if (::send(m_socket, std::data(string), std::size(string), 0) < 0)
343343#endif
344344
@@ -350,7 +350,7 @@ export namespace CppUtils::Network
350350 {
351351#if defined(OS_WINDOWS)
352352 if (::WSAGetLastError() == WSAEWOULDBLOCK)
353- #else
353+ #elif defined(OS_LINUX) or defined(OS_MACOS)
354354 if (errno == EWOULDBLOCK)
355355#endif
356356 return std::runtime_error{"Socket is non-blocking and no data is available"};
@@ -367,15 +367,15 @@ export namespace CppUtils::Network
367367 {
368368#if defined(OS_WINDOWS)
369369 const auto size = static_cast<int>(sizeof(T) - totalBytesReceived);
370- #else
370+ #elif defined(OS_LINUX) or defined(OS_MACOS)
371371 const auto size = sizeof(T) - totalBytesReceived;
372372#endif
373373 auto bytesReceived = ::recv(m_socket, reinterpret_cast<char*>(std::addressof(data)) + totalBytesReceived, size, 0);
374374 if (bytesReceived < 0)
375375 {
376376#if defined(OS_WINDOWS)
377377 if (WSAGetLastError() == WSAEWOULDBLOCK)
378- #else
378+ #elif defined(OS_LINUX) or defined(OS_MACOS)
379379 if (errno == EAGAIN)
380380 continue;
381381 if (errno == EWOULDBLOCK)
@@ -399,14 +399,14 @@ export namespace CppUtils::Network
399399 {
400400#if defined(OS_WINDOWS)
401401 auto bytesReceived = ::recv(m_socket, std::bit_cast<char*>(std::data(buffer)) + totalBytesReceived, static_cast<int>(bufferSize - totalBytesReceived), 0);
402- #else
402+ #elif defined(OS_LINUX) or defined(OS_MACOS)
403403 auto bytesReceived = ::recv(m_socket, std::data(buffer) + totalBytesReceived, bufferSize - totalBytesReceived, 0);
404404#endif
405405 if (bytesReceived < 0)
406406 {
407407#if defined(OS_WINDOWS)
408408 if (WSAGetLastError() == WSAEWOULDBLOCK)
409- #else
409+ #elif defined(OS_LINUX) or defined(OS_MACOS)
410410 if (errno == EAGAIN or errno == EWOULDBLOCK)
411411#endif
412412 continue;
0 commit comments