summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/tanya/async/event/iocp.d14
-rw-r--r--source/tanya/async/iocp.d2
-rw-r--r--source/tanya/network/socket.d387
-rw-r--r--source/tanya/sys/windows/def.d39
-rw-r--r--source/tanya/sys/windows/error.d114
-rw-r--r--source/tanya/sys/windows/package.d19
-rw-r--r--source/tanya/sys/windows/winsock2.d102
7 files changed, 444 insertions, 233 deletions
diff --git a/source/tanya/async/event/iocp.d b/source/tanya/async/event/iocp.d
index 826d6dd..e682ab9 100644
--- a/source/tanya/async/event/iocp.d
+++ b/source/tanya/async/event/iocp.d
@@ -27,10 +27,8 @@ import tanya.async.watcher;
import tanya.memory;
import tanya.memory.mmappool;
import tanya.network.socket;
-import core.sys.windows.basetyps;
import core.sys.windows.mswsock;
import core.sys.windows.winbase;
-import core.sys.windows.windef;
import core.sys.windows.winsock2;
/**
@@ -185,7 +183,7 @@ final class IOCPLoop : Loop
{
super();
- completionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
+ completionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, null, 0, 0);
if (!completionPort)
{
throw make!BadLoopException(defaultAllocator,
@@ -215,7 +213,7 @@ final class IOCPLoop : Loop
if (CreateIoCompletionPort(cast(HANDLE) socket.handle,
completionPort,
- cast(ULONG_PTR) (cast(void*) watcher),
+ cast(size_t) (cast(void*) watcher),
0) !is completionPort)
{
return false;
@@ -241,7 +239,7 @@ final class IOCPLoop : Loop
if (CreateIoCompletionPort(cast(HANDLE) transport.socket.handle,
completionPort,
- cast(ULONG_PTR) (cast(void*) watcher),
+ cast(size_t) (cast(void*) watcher),
0) !is completionPort)
{
return false;
@@ -286,7 +284,7 @@ final class IOCPLoop : Loop
override protected void poll() @nogc
{
DWORD lpNumberOfBytes;
- ULONG_PTR key;
+ size_t key;
LPOVERLAPPED overlap;
immutable timeout = cast(immutable int) blockTime.total!"msecs";
@@ -295,7 +293,7 @@ final class IOCPLoop : Loop
&key,
&overlap,
timeout);
- if (result == FALSE && overlap == NULL)
+ if (result == FALSE && overlap is null)
{
return; // Timeout
}
@@ -388,4 +386,4 @@ final class IOCPLoop : Loop
assert(false, "Unknown event");
}
}
-}
+} \ No newline at end of file
diff --git a/source/tanya/async/iocp.d b/source/tanya/async/iocp.d
index 47a01f6..afe16ef 100644
--- a/source/tanya/async/iocp.d
+++ b/source/tanya/async/iocp.d
@@ -54,4 +54,4 @@ class State
/// For keeping events or event masks.
int event;
-}
+} \ No newline at end of file
diff --git a/source/tanya/network/socket.d b/source/tanya/network/socket.d
index 0d9ba75..eb193be 100644
--- a/source/tanya/network/socket.d
+++ b/source/tanya/network/socket.d
@@ -44,12 +44,55 @@ version (Posix)
}
else version (Windows)
{
+ import core.sys.windows.basetyps : GUID;
+ import core.sys.windows.mswsock : WSAID_ACCEPTEX;
+ import core.sys.windows.winbase : LPOVERLAPPED,
+ GetModuleHandle,
+ GetProcAddress,
+ GetOverlappedResult,
+ ERROR_IO_PENDING,
+ ERROR_IO_INCOMPLETE;
+ import core.sys.windows.winsock2 : sockaddr,
+ freeaddrinfo,
+ getaddrinfo,
+ SD_RECEIVE,
+ SD_SEND,
+ SD_BOTH,
+ MSG_OOB,
+ MSG_PEEK,
+ MSG_DONTROUTE,
+ socklen_t,
+ SOCKADDR,
+ SOCKADDR_STORAGE,
+ LPWSAOVERLAPPED_COMPLETION_ROUTINE,
+ addrinfo,
+ sockaddr_in,
+ sockaddr_in6,
+ shutdown,
+ closesocket,
+ listen,
+ socket,
+ bind,
+ accept,
+ WSAGetLastError,
+ recv,
+ send,
+ getsockopt,
+ setsockopt,
+ ioctlsocket,
+ FIONBIO,
+ SOL_SOCKET,
+ SO_TYPE;
import tanya.async.iocp;
- import core.sys.windows.basetyps;
- import core.sys.windows.mswsock;
- import core.sys.windows.winbase;
- import core.sys.windows.windef;
- import core.sys.windows.winsock2;
+ import tanya.sys.windows.error : EWOULDBLOCK = WSAEWOULDBLOCK,
+ ECONNABORTED = WSAECONNABORTED,
+ ENOBUFS = WSAENOBUFS,
+ EOPNOTSUPP = WSAEOPNOTSUPP,
+ EPROTONOSUPPORT = WSAEPROTONOSUPPORT,
+ EPROTOTYPE = WSAEPROTOTYPE,
+ ETIMEDOUT = WSAETIMEDOUT,
+ ESOCKTNOSUPPORT = WSAESOCKTNOSUPPORT;
+ public import tanya.sys.windows.winsock2;
enum SocketType : size_t
{
@@ -58,71 +101,6 @@ else version (Windows)
private alias LingerField = ushort;
- enum : uint
- {
- IOC_UNIX = 0x00000000,
- IOC_WS2 = 0x08000000,
- IOC_PROTOCOL = 0x10000000,
- IOC_VOID = 0x20000000, // No parameters.
- IOC_OUT = 0x40000000, // Copy parameters back.
- IOC_IN = 0x80000000, // Copy parameters into.
- IOC_VENDOR = 0x18000000,
- IOC_INOUT = (IOC_IN | IOC_OUT), // Copy parameter into and get back.
- }
-
- template _WSAIO(int x, int y)
- {
- enum _WSAIO = IOC_VOID | x | y;
- }
- template _WSAIOR(int x, int y)
- {
- enum _WSAIOR = IOC_OUT | x | y;
- }
- template _WSAIOW(int x, int y)
- {
- enum _WSAIOW = IOC_IN | x | y;
- }
- template _WSAIORW(int x, int y)
- {
- enum _WSAIORW = IOC_INOUT | x | y;
- }
-
- alias SIO_ASSOCIATE_HANDLE = _WSAIOW!(IOC_WS2, 1);
- alias SIO_ENABLE_CIRCULAR_QUEUEING = _WSAIO!(IOC_WS2, 2);
- alias SIO_FIND_ROUTE = _WSAIOR!(IOC_WS2, 3);
- alias SIO_FLUSH = _WSAIO!(IOC_WS2, 4);
- alias SIO_GET_BROADCAST_ADDRESS = _WSAIOR!(IOC_WS2, 5);
- alias SIO_GET_EXTENSION_FUNCTION_POINTER = _WSAIORW!(IOC_WS2, 6);
- alias SIO_GET_QOS = _WSAIORW!(IOC_WS2, 7);
- alias SIO_GET_GROUP_QOS = _WSAIORW!(IOC_WS2, 8);
- alias SIO_MULTIPOINT_LOOPBACK = _WSAIOW!(IOC_WS2, 9);
- alias SIO_MULTICAST_SCOPE = _WSAIOW!(IOC_WS2, 10);
- alias SIO_SET_QOS = _WSAIOW!(IOC_WS2, 11);
- alias SIO_SET_GROUP_QOS = _WSAIOW!(IOC_WS2, 12);
- alias SIO_TRANSLATE_HANDLE = _WSAIORW!(IOC_WS2, 13);
- alias SIO_ROUTING_INTERFACE_QUERY = _WSAIORW!(IOC_WS2, 20);
- alias SIO_ROUTING_INTERFACE_CHANGE = _WSAIOW!(IOC_WS2, 21);
- alias SIO_ADDRESS_LIST_QUERY = _WSAIOR!(IOC_WS2, 22);
- alias SIO_ADDRESS_LIST_CHANGE = _WSAIO!(IOC_WS2, 23);
- alias SIO_QUERY_TARGET_PNP_HANDLE = _WSAIOR!(IOC_WS2, 24);
- alias SIO_NSP_NOTIFY_CHANGE = _WSAIOW!(IOC_WS2, 25);
-
- private alias GROUP = uint;
-
- enum
- {
- WSA_FLAG_OVERLAPPED = 0x01,
- MAX_PROTOCOL_CHAIN = 7,
- WSAPROTOCOL_LEN = 255,
- }
-
- struct WSAPROTOCOLCHAIN
- {
- int ChainLen;
- DWORD[MAX_PROTOCOL_CHAIN] ChainEntries;
- }
- alias LPWSAPROTOCOLCHAIN = WSAPROTOCOLCHAIN*;
-
struct WSAPROTOCOL_INFO
{
DWORD dwServiceFlags1;
@@ -157,16 +135,16 @@ else version (Windows)
GROUP g,
DWORD dwFlags);
int WSARecv(SOCKET s,
- LPWSABUF lpBuffers,
+ WSABUF* lpBuffers,
DWORD dwBufferCount,
- LPDWORD lpNumberOfBytesRecvd,
- LPDWORD lpFlags,
+ DWORD* lpNumberOfBytesRecvd,
+ DWORD* lpFlags,
LPOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
int WSASend(SOCKET s,
- LPWSABUF lpBuffers,
+ WSABUF* lpBuffers,
DWORD dwBufferCount,
- LPDWORD lpNumberOfBytesRecvd,
+ DWORD* lpNumberOfBytesRecvd,
DWORD lpFlags,
LPOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
@@ -181,39 +159,32 @@ else version (Windows)
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
alias LPFN_ACCEPTEX = BOOL function(SOCKET,
SOCKET,
- PVOID,
+ void*,
DWORD,
DWORD,
DWORD,
- LPDWORD,
+ DWORD*,
LPOVERLAPPED);
}
alias WSASocket = WSASocketW;
- alias LPFN_GETACCEPTEXSOCKADDRS = VOID function(PVOID,
+ alias LPFN_GETACCEPTEXSOCKADDRS = void function(void*,
DWORD,
DWORD,
DWORD,
SOCKADDR**,
- LPINT,
+ INT*,
SOCKADDR**,
- LPINT);
+ INT*);
const GUID WSAID_GETACCEPTEXSOCKADDRS = {
0xb5367df2, 0xcbac, 0x11cf,
[ 0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92 ],
};
- struct WSABUF
- {
- ULONG len;
- CHAR* buf;
- }
- alias WSABUF* LPWSABUF;
-
struct WSAOVERLAPPED
{
- ULONG_PTR Internal;
- ULONG_PTR InternalHigh;
+ size_t Internal;
+ size_t InternalHigh;
union
{
struct
@@ -221,7 +192,7 @@ else version (Windows)
DWORD Offset;
DWORD OffsetHigh;
}
- PVOID Pointer;
+ void* Pointer;
}
HANDLE hEvent;
}
@@ -241,13 +212,38 @@ else version (Windows)
private WSABUF buffer;
}
+ /**
+ * Socket returned if a connection has been established.
+ *
+ * Note: Available only on Windows.
+ */
class OverlappedConnectedSocket : ConnectedSocket
{
+ /**
+ * Create a socket.
+ *
+ * Params:
+ * handle = Socket handle.
+ * af = Address family.
+ */
this(SocketType handle, AddressFamily af) @nogc
{
super(handle, af);
}
+ /**
+ * Begins to asynchronously receive data from a connected socket.
+ *
+ * Params:
+ * buffer = Storage location for the received data.
+ * flags = Flags.
+ * overlapped = Unique operation identifier.
+ *
+ * Returns: $(D_KEYWORD true) if the operation could be finished synchronously.
+ * $(D_KEYWORD false) otherwise.
+ *
+ * Throws: $(D_PSYMBOL SocketException) if unable to receive.
+ */
bool beginReceive(ubyte[] buffer,
SocketState overlapped,
Flags flags = Flags(Flag.none)) @nogc @trusted
@@ -262,10 +258,10 @@ else version (Windows)
auto result = WSARecv(handle_,
&overlapped.buffer,
1u,
- NULL,
+ null,
&receiveFlags,
&overlapped.overlapped,
- NULL);
+ null);
if (result == socketError && !wouldHaveBlocked)
{
@@ -274,6 +270,18 @@ else version (Windows)
return result == 0;
}
+ /**
+ * Ends a pending asynchronous read.
+ *
+ * Params:
+ * overlapped = Unique operation identifier.
+ *
+ * Returns: Number of bytes received.
+ *
+ * Throws: $(D_PSYMBOL SocketException) if unable to receive.
+ *
+ * Postcondition: $(D_INLINECODE result >= 0).
+ */
int endReceive(SocketState overlapped) @nogc @trusted
out (count)
{
@@ -298,6 +306,19 @@ else version (Windows)
return lpNumber;
}
+ /**
+ * Sends data asynchronously to a connected socket.
+ *
+ * Params:
+ * buffer = Data to be sent.
+ * flags = Flags.
+ * overlapped = Unique operation identifier.
+ *
+ * Returns: $(D_KEYWORD true) if the operation could be finished synchronously.
+ * $(D_KEYWORD false) otherwise.
+ *
+ * Throws: $(D_PSYMBOL SocketException) if unable to send.
+ */
bool beginSend(ubyte[] buffer,
SocketState overlapped,
Flags flags = Flags(Flag.none)) @nogc @trusted
@@ -310,10 +331,10 @@ else version (Windows)
auto result = WSASend(handle_,
&overlapped.buffer,
1u,
- NULL,
+ null,
cast(DWORD) flags,
&overlapped.overlapped,
- NULL);
+ null);
if (result == socketError && !wouldHaveBlocked)
{
@@ -323,6 +344,18 @@ else version (Windows)
return result == 0;
}
+ /**
+ * Ends a pending asynchronous send.
+ *
+ * Params:
+ * overlapped = Unique operation identifier.
+ *
+ * Returns: Number of bytes sent.
+ *
+ * Throws: $(D_PSYMBOL SocketException) if unable to receive.
+ *
+ * Postcondition: $(D_INLINECODE result >= 0).
+ */
int endSend(SocketState overlapped) @nogc @trusted
out (count)
{
@@ -344,11 +377,22 @@ else version (Windows)
}
}
+ /**
+ * Windows stream socket overlapped I/O.
+ */
class OverlappedStreamSocket : StreamSocket
{
// Accept extension function pointer.
package LPFN_ACCEPTEX acceptExtension;
+ /**
+ * Create a socket.
+ *
+ * Params:
+ * af = Address family.
+ *
+ * Throws: $(D_PSYMBOL SocketException) on errors.
+ */
this(AddressFamily af) @nogc @trusted
{
super(af);
@@ -368,8 +412,8 @@ else version (Windows)
&acceptExtension,
acceptExtension.sizeof,
&dwBytes,
- NULL,
- NULL);
+ null,
+ null);
if (!result == socketError)
{
throw make!SocketException(defaultAllocator,
@@ -377,6 +421,17 @@ else version (Windows)
}
}
+ /**
+ * Begins an asynchronous operation to accept an incoming connection attempt.
+ *
+ * Params:
+ * overlapped = Unique operation identifier.
+ *
+ * Returns: $(D_KEYWORD true) if the operation could be finished synchronously.
+ * $(D_KEYWORD false) otherwise.
+ *
+ * Throws: $(D_PSYMBOL SocketException) on accept errors.
+ */
bool beginAccept(SocketState overlapped) @nogc @trusted
{
auto socket = cast(SocketType) socket(addressFamily, 1, 0);
@@ -412,6 +467,17 @@ else version (Windows)
return result == TRUE;
}
+ /**
+ * Asynchronously accepts an incoming connection attempt and creates a
+ * new socket to handle remote host communication.
+ *
+ * Params:
+ * overlapped = Unique operation identifier.
+ *
+ * Returns: Connected socket.
+ *
+ * Throws: $(D_PSYMBOL SocketException) if unable to accept.
+ */
OverlappedConnectedSocket endAccept(SocketState overlapped)
@nogc @trusted
{
@@ -433,133 +499,6 @@ else version (Windows)
}
}
}
-else version (D_Ddoc)
-{
- /// Native socket representation type.
- enum SocketType;
-
- /**
- * Socket returned if a connection has been established.
- *
- * Note: Available only on Windows.
- */
- class OverlappedConnectedSocket : ConnectedSocket
- {
- /**
- * Create a socket.
- *
- * Params:
- * handle = Socket handle.
- * af = Address family.
- */
- this(SocketType handle, AddressFamily af) @nogc;
-
- /**
- * Begins to asynchronously receive data from a connected socket.
- *
- * Params:
- * buffer = Storage location for the received data.
- * flags = Flags.
- * overlapped = Unique operation identifier.
- *
- * Returns: $(D_KEYWORD true) if the operation could be finished synchronously.
- * $(D_KEYWORD false) otherwise.
- *
- * Throws: $(D_PSYMBOL SocketException) if unable to receive.
- */
- bool beginReceive(ubyte[] buffer,
- SocketState overlapped,
- Flags flags = Flags(Flag.none)) @nogc @trusted;
-
- /**
- * Ends a pending asynchronous read.
- *
- * Params:
- * overlapped = Unique operation identifier.
- *
- * Returns: Number of bytes received.
- *
- * Throws: $(D_PSYMBOL SocketException) if unable to receive.
- *
- * Postcondition: $(D_INLINECODE result >= 0).
- */
- int endReceive(SocketState overlapped) @nogc @trusted;
-
- /**
- * Sends data asynchronously to a connected socket.
- *
- * Params:
- * buffer = Data to be sent.
- * flags = Flags.
- * overlapped = Unique operation identifier.
- *
- * Returns: $(D_KEYWORD true) if the operation could be finished synchronously.
- * $(D_KEYWORD false) otherwise.
- *
- * Throws: $(D_PSYMBOL SocketException) if unable to send.
- */
- bool beginSend(ubyte[] buffer,
- SocketState overlapped,
- Flags flags = Flags(Flag.none)) @nogc @trusted;
-
- /**
- * Ends a pending asynchronous send.
- *
- * Params:
- * overlapped = Unique operation identifier.
- *
- * Returns: Number of bytes sent.
- *
- * Throws: $(D_PSYMBOL SocketException) if unable to receive.
- *
- * Postcondition: $(D_INLINECODE result >= 0).
- */
- int endSend(SocketState overlapped) @nogc @trusted;
- }
-
- /**
- * Windows stream socket overlapped I/O.
- */
- class OverlappedStreamSocket : StreamSocket
- {
- /**
- * Create a socket.
- *
- * Params:
- * af = Address family.
- *
- * Throws: $(D_PSYMBOL SocketException) on errors.
- */
- this(AddressFamily af) @nogc @trusted;
-
- /**
- * Begins an asynchronous operation to accept an incoming connection attempt.
- *
- * Params:
- * overlapped = Unique operation identifier.
- *
- * Returns: $(D_KEYWORD true) if the operation could be finished synchronously.
- * $(D_KEYWORD false) otherwise.
- *
- * Throws: $(D_PSYMBOL SocketException) on accept errors.
- */
- bool beginAccept(SocketState overlapped) @nogc @trusted;
-
- /**
- * Asynchronously accepts an incoming connection attempt and creates a
- * new socket to handle remote host communication.
- *
- * Params:
- * overlapped = Unique operation identifier.
- *
- * Returns: Connected socket.
- *
- * Throws: $(D_PSYMBOL SocketException) if unable to accept.
- */
- OverlappedConnectedSocket endAccept(SocketState overlapped)
- @nogc @trusted;
- }
-}
/**
* Socket option that specifies what should happen when the socket that
@@ -1624,4 +1563,4 @@ private @property int lastError() nothrow @safe @nogc
{
return errno;
}
-}
+} \ No newline at end of file
diff --git a/source/tanya/sys/windows/def.d b/source/tanya/sys/windows/def.d
new file mode 100644
index 0000000..6b0634e
--- /dev/null
+++ b/source/tanya/sys/windows/def.d
@@ -0,0 +1,39 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * Copyright: Eugene Wissner 2017.
+ * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
+ * Mozilla Public License, v. 2.0).
+ * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
+ * Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/sys/windows/def.d,
+ * tanya/sys/windows/def.d)
+ */
+module tanya.sys.windows.def;
+
+version (Windows):
+
+alias BYTE = ubyte;
+alias TBYTE = wchar; // If Unicode, otherwise char.
+alias CHAR = char; // Signed or unsigned char.
+alias TCHAR = wchar; // If Unicode, otherwise char.
+alias SHORT = short;
+alias USHORT = ushort;
+alias WORD = ushort;
+alias INT = int;
+alias UINT = uint;
+alias LONG = int;
+alias ULONG = uint;
+alias DWORD = uint;
+alias LONGLONG = long; // Or double.
+alias ULONGLONG = ulong; // Or double.
+alias DWORDLONG = ulong;
+alias FLOAT = float;
+alias BOOL = int;
+alias BOOLEAN = BYTE;
+
+alias HANDLE = void*;
+
+enum TRUE = 1;
+enum FALSE = 0; \ No newline at end of file
diff --git a/source/tanya/sys/windows/error.d b/source/tanya/sys/windows/error.d
new file mode 100644
index 0000000..0b8c9e9
--- /dev/null
+++ b/source/tanya/sys/windows/error.d
@@ -0,0 +1,114 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * Copyright: Eugene Wissner 2017.
+ * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
+ * Mozilla Public License, v. 2.0).
+ * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
+ * Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/sys/windows/error.d,
+ * tanya/sys/windows/error.d)
+ */
+module tanya.sys.windows.error;
+
+version (Windows):
+
+private enum WSABASEERR = 10000;
+enum
+{
+ WSAEINTR = WSABASEERR + 4,
+ WSAEBADF = WSABASEERR + 9,
+ WSAEACCES = WSABASEERR + 13,
+ WSAEFAULT = WSABASEERR + 14,
+ WSAEINVAL = WSABASEERR + 22,
+ WSAEMFILE = WSABASEERR + 24,
+
+ WSAEWOULDBLOCK = WSABASEERR + 35,
+ WSAEINPROGRESS = WSABASEERR + 36,
+ WSAEALREADY = WSABASEERR + 37,
+ WSAENOTSOCK = WSABASEERR + 38,
+ WSAEDESTADDRREQ = WSABASEERR + 39,
+ WSAEMSGSIZE = WSABASEERR + 40,
+ WSAEPROTOTYPE = WSABASEERR + 41,
+ WSAENOPROTOOPT = WSABASEERR + 42,
+ WSAEPROTONOSUPPORT = WSABASEERR + 43,
+ WSAESOCKTNOSUPPORT = WSABASEERR + 44,
+ WSAEOPNOTSUPP = WSABASEERR + 45,
+ WSAEPFNOSUPPORT = WSABASEERR + 46,
+ WSAEAFNOSUPPORT = WSABASEERR + 47,
+ WSAEADDRINUSE = WSABASEERR + 48,
+ WSAEADDRNOTAVAIL = WSABASEERR + 49,
+ WSAENETDOWN = WSABASEERR + 50,
+ WSAENETUNREACH = WSABASEERR + 51,
+ WSAENETRESET = WSABASEERR + 52,
+ WSAECONNABORTED = WSABASEERR + 53,
+ WSAECONNRESET = WSABASEERR + 54,
+ WSAENOBUFS = WSABASEERR + 55,
+ WSAEISCONN = WSABASEERR + 56,
+ WSAENOTCONN = WSABASEERR + 57,
+ WSAESHUTDOWN = WSABASEERR + 58,
+ WSAETOOMANYREFS = WSABASEERR + 59,
+ WSAETIMEDOUT = WSABASEERR + 60,
+ WSAECONNREFUSED = WSABASEERR + 61,
+ WSAELOOP = WSABASEERR + 62,
+ WSAENAMETOOLONG = WSABASEERR + 63,
+ WSAEHOSTDOWN = WSABASEERR + 64,
+ WSAEHOSTUNREACH = WSABASEERR + 65,
+ WSAENOTEMPTY = WSABASEERR + 66,
+ WSAEPROCLIM = WSABASEERR + 67,
+ WSAEUSERS = WSABASEERR + 68,
+ WSAEDQUOT = WSABASEERR + 69,
+ WSAESTALE = WSABASEERR + 70,
+ WSAEREMOTE = WSABASEERR + 71,
+
+ WSASYSNOTREADY = WSABASEERR + 91,
+ WSAVERNOTSUPPORTED = WSABASEERR + 92,
+ WSANOTINITIALISED = WSABASEERR + 93,
+ WSAEDISCON = WSABASEERR + 101,
+ WSAENOMORE = WSABASEERR + 102,
+ WSAECANCELLED = WSABASEERR + 103,
+ WSAEINVALIDPROCTABLE = WSABASEERR + 104,
+ WSAEINVALIDPROVIDER = WSABASEERR + 105,
+ WSAEPROVIDERFAILEDINIT = WSABASEERR + 106,
+ WSASYSCALLFAILURE = WSABASEERR + 107,
+ WSASERVICE_NOT_FOUND = WSABASEERR + 108,
+ WSATYPE_NOT_FOUND = WSABASEERR + 109,
+ WSA_E_NO_MORE = WSABASEERR + 110,
+ WSA_E_CANCELLED = WSABASEERR + 111,
+ WSAEREFUSED = WSABASEERR + 112,
+
+ WSAHOST_NOT_FOUND = WSABASEERR + 1001,
+ WSATRY_AGAIN = WSABASEERR + 1002,
+ WSANO_RECOVERY = WSABASEERR + 1003,
+ WSANO_DATA = WSABASEERR + 1004,
+
+ WSA_QOS_RECEIVERS = WSABASEERR + 1005,
+ WSA_QOS_SENDERS = WSABASEERR + 1006,
+ WSA_QOS_NO_SENDERS = WSABASEERR + 1007,
+ WSA_QOS_NO_RECEIVERS = WSABASEERR + 1008,
+ WSA_QOS_REQUEST_CONFIRMED = WSABASEERR + 1009,
+ WSA_QOS_ADMISSION_FAILURE = WSABASEERR + 1010,
+ WSA_QOS_POLICY_FAILURE = WSABASEERR + 1011,
+ WSA_QOS_BAD_STYLE = WSABASEERR + 1012,
+ WSA_QOS_BAD_OBJECT = WSABASEERR + 1013,
+
+ WSA_QOS_TRAFFIC_CTRL_ERROR = WSABASEERR + 1014,
+ WSA_QOS_GENERIC_ERROR = WSABASEERR + 1015,
+ WSA_QOS_ESERVICETYPE = WSABASEERR + 1016,
+ WSA_QOS_EFLOWSPEC = WSABASEERR + 1017,
+ WSA_QOS_EPROVSPECBUF = WSABASEERR + 1018,
+ WSA_QOS_EFILTERSTYLE = WSABASEERR + 1019,
+ WSA_QOS_EFILTERTYPE = WSABASEERR + 1020,
+ WSA_QOS_EFILTERCOUNT = WSABASEERR + 1021,
+ WSA_QOS_EOBJLENGTH = WSABASEERR + 1022,
+ WSA_QOS_EFLOWCOUNT = WSABASEERR + 1023,
+ WSA_QOS_EUNKOWNPSOBJ = WSABASEERR + 1024,
+ WSA_QOS_EPOLICYOBJ = WSABASEERR + 1025,
+ WSA_QOS_EFLOWDESC = WSABASEERR + 1026,
+ WSA_QOS_EPSFLOWSPEC = WSABASEERR + 1027,
+ WSA_QOS_EPSFILTERSPEC = WSABASEERR + 1028,
+ WSA_QOS_ESDMODEOBJ = WSABASEERR + 1029,
+ WSA_QOS_ESHAPERATEOBJ = WSABASEERR + 1030,
+ WSA_QOS_RESERVED_PETYPE = WSABASEERR + 1031,
+} \ No newline at end of file
diff --git a/source/tanya/sys/windows/package.d b/source/tanya/sys/windows/package.d
new file mode 100644
index 0000000..f9991a9
--- /dev/null
+++ b/source/tanya/sys/windows/package.d
@@ -0,0 +1,19 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * Copyright: Eugene Wissner 2017.
+ * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
+ * Mozilla Public License, v. 2.0).
+ * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
+ * Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/sys/windows/package.d,
+ * tanya/sys/windows/package.d)
+ */
+module tanya.sys.windows;
+
+version (Windows):
+
+public import tanya.sys.windows.def;
+public import tanya.sys.windows.error;
+public import tanya.sys.windows.winsock2; \ No newline at end of file
diff --git a/source/tanya/sys/windows/winsock2.d b/source/tanya/sys/windows/winsock2.d
new file mode 100644
index 0000000..31139d0
--- /dev/null
+++ b/source/tanya/sys/windows/winsock2.d
@@ -0,0 +1,102 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * Copyright: Eugene Wissner 2017.
+ * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
+ * Mozilla Public License, v. 2.0).
+ * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
+ * Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/sys/windows/winsock2.d,
+ * tanya/sys/windows/winsock2.d)
+ */
+module tanya.sys.windows.winsock2;
+
+version (Windows):
+
+public import tanya.sys.windows.def;
+
+alias SOCKET = size_t;
+enum SOCKET INVALID_SOCKET = ~0;
+enum SOCKET_ERROR = -1;
+
+enum
+{
+ IOC_UNIX = 0x00000000,
+ IOC_WS2 = 0x08000000,
+ IOC_PROTOCOL = 0x10000000,
+ IOC_VOID = 0x20000000, // No parameters.
+ IOC_OUT = 0x40000000, // Copy parameters back.
+ IOC_IN = 0x80000000, // Copy parameters into.
+ IOC_VENDOR = 0x18000000,
+ IOC_WSK = (IOC_WS2 | 0x07000000), // _WIN32_WINNT >= 0x0600.
+ IOC_INOUT = (IOC_IN | IOC_OUT), // Copy parameter into and get back.
+}
+
+template _WSAIO(int x, int y)
+{
+ enum _WSAIO = IOC_VOID | x | y;
+}
+template _WSAIOR(int x, int y)
+{
+ enum _WSAIOR = IOC_OUT | x | y;
+}
+template _WSAIOW(int x, int y)
+{
+ enum _WSAIOW = IOC_IN | x | y;
+}
+template _WSAIORW(int x, int y)
+{
+ enum _WSAIORW = IOC_INOUT | x | y;
+}
+
+alias SIO_ASSOCIATE_HANDLE = _WSAIOW!(IOC_WS2, 1);
+alias SIO_ENABLE_CIRCULAR_QUEUEING = _WSAIO!(IOC_WS2, 2);
+alias SIO_FIND_ROUTE = _WSAIOR!(IOC_WS2, 3);
+alias SIO_FLUSH = _WSAIO!(IOC_WS2, 4);
+alias SIO_GET_BROADCAST_ADDRESS = _WSAIOR!(IOC_WS2, 5);
+alias SIO_GET_EXTENSION_FUNCTION_POINTER = _WSAIORW!(IOC_WS2, 6);
+alias SIO_GET_QOS = _WSAIORW!(IOC_WS2, 7);
+alias SIO_GET_GROUP_QOS = _WSAIORW!(IOC_WS2, 8);
+alias SIO_MULTIPOINT_LOOPBACK = _WSAIOW!(IOC_WS2, 9);
+alias SIO_MULTICAST_SCOPE = _WSAIOW!(IOC_WS2, 10);
+alias SIO_SET_QOS = _WSAIOW!(IOC_WS2, 11);
+alias SIO_SET_GROUP_QOS = _WSAIOW!(IOC_WS2, 12);
+alias SIO_TRANSLATE_HANDLE = _WSAIORW!(IOC_WS2, 13);
+alias SIO_ROUTING_INTERFACE_QUERY = _WSAIORW!(IOC_WS2, 20);
+alias SIO_ROUTING_INTERFACE_CHANGE = _WSAIOW!(IOC_WS2, 21);
+alias SIO_ADDRESS_LIST_QUERY = _WSAIOR!(IOC_WS2, 22);
+alias SIO_ADDRESS_LIST_CHANGE = _WSAIO!(IOC_WS2, 23);
+alias SIO_QUERY_TARGET_PNP_HANDLE = _WSAIOR!(IOC_WS2, 24);
+alias SIO_NSP_NOTIFY_CHANGE = _WSAIOW!(IOC_WS2, 25);
+
+alias GROUP = uint;
+
+enum
+{
+ WSA_FLAG_OVERLAPPED = 0x01,
+ WSA_FLAG_MULTIPOINT_C_ROOT = 0x02,
+ WSA_FLAG_MULTIPOINT_C_LEAF = 0x04,
+ WSA_FLAG_MULTIPOINT_D_ROOT = 0x08,
+ WSA_FLAG_MULTIPOINT_D_LEAF = 0x10,
+ WSA_FLAG_ACCESS_SYSTEM_SECURITY = 0x40,
+ WSA_FLAG_NO_HANDLE_INHERIT = 0x80,
+ WSA_FLAG_REGISTERED_IO = 0x100,
+}
+
+enum MAX_PROTOCOL_CHAIN = 7;
+enum BASE_PROTOCOL = 1;
+enum LAYERED_PROTOCOL = 0;
+enum WSAPROTOCOL_LEN = 255;
+
+struct WSAPROTOCOLCHAIN
+{
+ int ChainLen;
+ DWORD[MAX_PROTOCOL_CHAIN] ChainEntries;
+}
+
+struct WSABUF
+{
+ ULONG len;
+ CHAR* buf;
+} \ No newline at end of file