/** * 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); }