1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
/**
* Windows API header module
*
* Translated from MinGW Windows headers
*
* Authors: Daniel Keep
* License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
* Source: $(DRUNTIMESRC core/sys/windows/_mswsock.d)
*/
module core.sys.windows.mswsock;
version (Windows):
@system:
import core.sys.windows.winbase, core.sys.windows.windef;
import core.sys.windows.basetyps, core.sys.windows.w32api;
import core.sys.windows.winsock2;
//static if (_WIN32_WINNT >= 0x500) {
enum {
/* WinNT5+:
ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
SO_MAXDG = 0x7009,
SO_MAXPATHDG = 0x700A,
}
//}
enum {
/* WinNT4+:
ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options_for_windows_nt_4_0_2.htm */
SO_CONNDATA = 0x7000,
SO_CONNOPT = 0x7001,
SO_DISCDATA = 0x7002,
SO_DISCOPT = 0x7003,
SO_CONNDATALEN = 0x7004,
SO_CONNOPTLEN = 0x7005,
SO_DISCDATALEN = 0x7006,
SO_DISCOPTLEN = 0x7007,
/* WinNT4:
ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
SO_UPDATE_ACCEPT_CONTENT = 0x700B,
}
enum {
/* Win95+, WinNT4+ but apparently shouldn't used: mark as deprecated?
ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
SO_OPENTYPE = 0x7008,
/* Win95+; these two are passed to the SO_OPENTYPE option as arguments,
so would they be deprecated as well?
ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
SO_SYNCHRONOUS_ALERT = 0x0010,
SO_SYNCHRONOUS_NONALERT = 0x0020,
/* Win95:
ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/socket_options.htm */
SO_CONNECT_TIME = 0x700C,
}
enum {
TCP_BSDURGENT = 0x7000,
}
/* These *appear* to be constants for passing to the TransmitFile /
TransmitPackets functions, which are available in WinNT3.51+
ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmitfile_2.htm */
enum {
TF_DISCONNECT = 1,
TF_REUSE_SOCKET = 2,
TF_WRITE_BEHIND = 4,
TF_USE_DEFAULT_WORKER = 0,
TF_USE_SYSTEM_THREAD = 16,
TF_USE_KERNEL_APC = 32
}
/* Win95+, WinNT3.51+
ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmit_file_buffers_2.htm */
struct TRANSMIT_FILE_BUFFERS {
PVOID Head;
DWORD HeadLength;
PVOID Tail;
DWORD TailLength;
}
alias TRANSMIT_FILE_BUFFERS* PTRANSMIT_FILE_BUFFERS, LPTRANSMIT_FILE_BUFFERS;
extern(Windows) {
/* Win95+, WinNT3.51+
ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsarecvex_2.htm */
int WSARecvEx(SOCKET, char*, int, int*);
/* Win95+, WinNT3.51+
ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/getacceptexSOCKADDRs_2.htm */
VOID GetAcceptExSockaddrs(PVOID, DWORD, DWORD, DWORD, SOCKADDR**, LPINT, SOCKADDR**, LPINT);
/* WinNT3.51+
ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmitfile_2.htm */
BOOL TransmitFile(SOCKET, HANDLE, DWORD, DWORD, LPOVERLAPPED, LPTRANSMIT_FILE_BUFFERS, DWORD);
/* WinNT3.51+
ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/acceptex_2.htm */
alias BOOL function(SOCKET, SOCKET, PVOID, DWORD, DWORD, DWORD, LPDWORD, LPOVERLAPPED) LPFN_ACCEPTEX;
const GUID WSAID_ACCEPTEX = {0xb5367df1,0xcbac,0x11cf,[0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92]};
alias BOOL function(SOCKET, SOCKADDR*, int, PVOID, DWORD, LPDWORD, LPOVERLAPPED) LPFN_CONNECTEX;
const GUID WSAID_CONNECTEX = {0x25a207b9,0xddf3,0x4660,[0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e]};
}
static if (_WIN32_WINNT >= 0x501) {
/* These appear to be constants for the TRANSMIT_PACKETS_ELEMENT
* structure below, so I've given them the same minimum version
*/
enum {
TP_ELEMENT_FILE = 1,
TP_ELEMENT_MEMORY = 2,
TP_ELEMENT_EOP = 4
}
/* WinXP+, Srv2k3+
* ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/transmit_packets_element_2.htm
*/
struct TRANSMIT_PACKETS_ELEMENT {
ULONG dwElFlags;
ULONG cLength;
union {
struct {
LARGE_INTEGER nFileOffset;
HANDLE hFile;
}
PVOID pBuffer;
}
}
struct WSABUF {
ULONG len;
CHAR* buf;
}
alias WSABUF* LPWSABUF;
/* WinXP+, Server2003+:
* ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsamsg_2.htm
*/
struct WSAMSG {
LPSOCKADDR name;
INT namelen;
LPWSABUF lpBuffers;
DWORD dwBufferCount;
WSABUF Control;
DWORD dwFlags;
}
alias WSAMSG* PWSAMSG, LPWSAMSG;
/* According to MSDN docs, the WSAMSG.Control buffer starts with a
cmsghdr header of the following form. See also RFC 2292. */
/* DK: Confirmed. So I suppose these should get the same version as
WSAMSG... */
struct WSACMSGHDR {
SIZE_T cmsg_len;
INT cmsg_level;
INT cmsg_type;
// followed by UCHAR cmsg_data[];
}
}
static if (_WIN32_WINNT >= 0x600) {
/* TODO: Standard Posix.1g macros as per RFC 2292, with WSA_uglification. */
/* DK: MinGW doesn't define these, and neither does the MSDN docs. Might have
to actually look up RFC 2292... */
/+
#if 0
#define WSA_CMSG_FIRSTHDR(mhdr)
#define WSA_CMSG_NXTHDR(mhdr, cmsg)
#define WSA_CMSG_SPACE(length)
#define WSA_CMSG_LEN(length)
#endif
+/
/* Win Vista+, Srv2k3+
* ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/disconnectex_2.htm
*/
extern(Windows) BOOL DisconnectEx(SOCKET, LPOVERLAPPED, DWORD, DWORD);
}
static if (_WIN32_WINNT >= 0x501) {
/* WinXP+, Srv2k3+
* ms-help://MS.MSDNQTR.2003FEB.1033/winsock/winsock/wsarecvmsg_2.htm
*/
extern(Windows) int WSARecvMsg(SOCKET, LPWSAMSG, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
}
|