From 7f4b865a5bf94dea63ff5510a801df0ad315bfdb Mon Sep 17 00:00:00 2001 From: Aki Date: Thu, 31 Mar 2022 22:59:55 +0200 Subject: Added naive support for posix platforms in NetSock --- NetEx/NetSock.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 13 deletions(-) (limited to 'NetEx') diff --git a/NetEx/NetSock.cpp b/NetEx/NetSock.cpp index 38ce9d5..3d3da63 100644 --- a/NetEx/NetSock.cpp +++ b/NetEx/NetSock.cpp @@ -13,7 +13,25 @@ #include "NetSock.h" +#ifdef _WIN32 #include +using socklen_t = int; +#else +#include +#include +#include +#include +#define INVALID_SOCKET -1 +#define SOCKET_ERROR -1 +#define WSAENETDOWN ENETDOWN +#define WSAENETRESET ENETRESET +#define WSAEINTR EINTR +#define WSAESHUTDOWN ESHUTDOWN +#define WSAECONNABORTED ECONNABORTED +#define WSAECONNRESET ECONNRESET +#define WSAETIMEDOUT ETIMEDOUT +#define WSAEWOULDBLOCK EWOULDBLOCK +#endif #include @@ -94,11 +112,11 @@ NetSock::accept(NetAddr* addr) { if (closed || s == INVALID_SOCKET) return 0; - SOCKET conn = INVALID_SOCKET; + int conn = INVALID_SOCKET; if (addr) { sockaddr a; - int asize = sizeof(a); + socklen_t asize = sizeof(a); conn = ::accept(s, &a, &asize); @@ -189,7 +207,7 @@ NetSock::recvfrom(NetAddr* a) int rlen = 0; if (a) { - int addrlen = a->GetSockAddrLength(); + socklen_t addrlen = a->GetSockAddrLength(); rlen = ::recvfrom(s, rbuf, sizeof(rbuf), 0, a->GetSockAddr(), &addrlen); a->InitFromSockAddr(); } @@ -216,21 +234,20 @@ NetSock::select(SELECT_TYPE t, long seconds, long microseconds) { if (closed || s == INVALID_SOCKET) return INVALID_SOCKET; - FD_SET fd; - ZeroMemory(&fd, sizeof(fd)); + fd_set fd; + std::memset(&fd, 0, sizeof(fd)); FD_SET(s, &fd); - TIMEVAL timeval = {seconds, microseconds}; - TIMEVAL* timeout = &timeval; + struct timeval timeout = {seconds, microseconds}; if (t == SELECT_READ) - return stat = ::select(1, &fd, 0, 0, timeout); + return stat = ::select(1, &fd, 0, 0, &timeout); else if (t == SELECT_WRITE) - return stat = ::select(1, 0, &fd, 0, timeout); + return stat = ::select(1, 0, &fd, 0, &timeout); else if (t == (SELECT_READ|SELECT_WRITE)) - return stat = ::select(1, &fd, &fd, 0, timeout); + return stat = ::select(1, &fd, &fd, 0, &timeout); return 0; } @@ -245,8 +262,12 @@ NetSock::set_timeout(int msecs) // zero timeout means non-blocking if (msecs == 0) { - u_long nonblocking = 1; - if (::ioctlsocket(s, FIONBIO, &nonblocking) == SOCKET_ERROR) { +#ifdef _WIN32 + u_long nonblocking = 1; + if (::ioctlsocket(s, FIONBIO, &nonblocking) == SOCKET_ERROR) { +#else + if (::fcntl(s, F_SETFL, (fcntl(s, F_GETFL, 0) | O_NONBLOCK)) == SOCKET_ERROR) { +#endif stat = NetLayer::GetLastError(); return stat; } @@ -255,8 +276,12 @@ NetSock::set_timeout(int msecs) // non-zero timeout means blocking else { if (current_timeout == 0) { +#ifdef _WIN32 u_long nonblocking = 0; // disable non-blocking if (::ioctlsocket(s, FIONBIO, &nonblocking) == SOCKET_ERROR) { +#else + if (::fcntl(s, F_SETFL, (fcntl(s, F_GETFL, 0) & ~O_NONBLOCK)) == SOCKET_ERROR) { +#endif stat = NetLayer::GetLastError(); return stat; } @@ -286,7 +311,11 @@ int NetSock::shutdown_input() { if (closed || s == INVALID_SOCKET) return INVALID_SOCKET; +#ifdef _WIN32 ::shutdown(s, SD_RECEIVE); +#else + ::shutdown(s, SHUT_RD); +#endif return 0; } @@ -296,7 +325,11 @@ int NetSock::shutdown_output() { if (closed || s == INVALID_SOCKET) return INVALID_SOCKET; +#ifdef _WIN32 ::shutdown(s, SD_SEND); +#else + ::shutdown(s, SHUT_WR); +#endif return 0; } @@ -306,8 +339,13 @@ int NetSock::close() { if (s != INVALID_SOCKET && !closed) { +#ifdef _WIN32 ::shutdown(s, SD_BOTH); ::closesocket(s); +#else + ::shutdown(s, SHUT_RDWR); + ::close(s); +#endif closed = true; } @@ -321,7 +359,7 @@ std::uint32_t NetSock::max_packet_size() const { std::uint32_t size = 0; - int len = sizeof(size); + socklen_t len = sizeof(size); ::getsockopt(s, SOL_SOCKET, 0x2003, (char*) &size, &len); -- cgit v1.1