21#include "../../string_func.h"
22#include "../../3rdparty/fmt/format.h"
25#include "../../safeguards.h"
42 return this->
error == WSAEWOULDBLOCK;
46 return this->
error == EWOULDBLOCK || this->
error == EAGAIN;
57 return this->
error == WSAECONNRESET;
59 return this->
error == ECONNRESET;
70 return this->
error == WSAEWOULDBLOCK;
72 return this->
error == EINPROGRESS;
85 if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr, this->
error,
86 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer,
static_cast<DWORD
>(std::size(buffer)),
nullptr) == 0) {
87 this->
message.assign(fmt::format(
"Unknown error {}", this->
error));
97 static std::mutex mutex;
98 std::lock_guard<std::mutex> guard(mutex);
111 return this->
error != 0;
136 u_long nonblocking = 1;
137 return ioctlsocket(d, FIONBIO, &nonblocking) == 0;
138#elif defined __EMSCRIPTEN__
142 return ioctl(d, FIONBIO, &nonblocking) == 0;
158 return setsockopt(d, IPPROTO_TCP, TCP_NODELAY, (
const char *)&flags,
sizeof(flags)) == 0;
172 return setsockopt(d, SOL_SOCKET, SO_REUSEADDR, (
const char *)&reuse_port,
sizeof(reuse_port)) == 0;
175 return setsockopt(d, SOL_SOCKET, SO_REUSEPORT, &reuse_port,
sizeof(reuse_port)) == 0;
187 socklen_t len =
sizeof(err);
188 getsockopt(d, SOL_SOCKET, SO_ERROR, (
char *)&err, &len);
Abstraction of a network error where all implementation details of the error codes are encapsulated i...
bool WouldBlock() const
Check whether this error describes that the operation would block.
bool IsConnectInProgress() const
Check whether this error describes a connect is in progress.
int error
The underlying error number from errno or WSAGetLastError.
bool HasError() const
Check whether an error was actually set.
bool IsConnectionReset() const
Check whether this error describes a connection reset.
std::string message
The string representation of the error (set on first call to AsString).
const std::string & AsString() const
Get the string representation of the error message.
NetworkError(int error)
Construct the network error with the given error code.
static NetworkError GetLast()
Get the last network error.
bool SetReusePort(SOCKET d)
Try to set the socket to reuse ports.
bool SetNoDelay(SOCKET d)
Try to set the socket to not delay sending.
bool SetNonBlocking(SOCKET d)
Try to set the socket into non-blocking mode.
NetworkError GetSocketError(SOCKET d)
Get the error from a socket, if any.
Network stuff has many things that needs to be included and/or implemented by default.
Definition of base types and functions in a cross-platform compatible way.
std::string FS2OTTD(const std::wstring &name)
Convert to OpenTTD's encoding from a wide string.