-#ifndef _WS2DEF_
+#pragma once
+
#define _WS2DEF_
#ifdef __cplusplus
extern "C" {
#endif
+#if !defined(_WINSOCK2API_) && defined(_WINSOCKAPI_)
+#error Include only winsock2.h, not both winsock.h and ws2def.h in the same module.
+#endif
+#if (_WIN32_WINNT >= 0x0600)
+#ifdef _MSC_VER
+#define WS2DEF_INLINE __inline
+#else
+#define WS2DEF_INLINE extern inline
+#endif
-#ifdef __cplusplus
-}
+#endif/* (_WIN32_WINNT >= 0x0600) */
+
+#include <inaddr.h>
+
+typedef USHORT ADDRESS_FAMILY;
+
+#define AF_UNSPEC 0
+#define AF_UNIX 1
+#define AF_INET 2
+#define AF_IMPLINK 3
+#define AF_PUP 4
+#define AF_CHAOS 5
+#define AF_NS 6
+#define AF_IPX AF_NS
+#define AF_ISO 7
+#define AF_OSI AF_ISO
+#define AF_ECMA 8
+#define AF_DATAKIT 9
+#define AF_CCITT 10
+#define AF_SNA 11
+#define AF_DECnet 12
+#define AF_DLI 13
+#define AF_LAT 14
+#define AF_HYLINK 15
+#define AF_APPLETALK 16
+#define AF_NETBIOS 17
+#define AF_VOICEVIEW 18
+#define AF_FIREFOX 19
+#define AF_UNKNOWN1 20
+#define AF_BAN 21
+#define AF_ATM 22
+#define AF_INET6 23
+#define AF_CLUSTER 24
+#define AF_12844 25
+#define AF_IRDA 26
+#define AF_NETDES 28
+
+#if (_WIN32_WINNT < 0x0501)
+
+#define AF_MAX 29
+
+#else
+
+#define AF_TCNPROCESS 29
+#define AF_TCNMESSAGE 30
+#define AF_ICLFXBM 31
+
+#if(_WIN32_WINNT < 0x0600)
+
+#define AF_MAX 32
+
+#else
+
+#define AF_BTH 32
+#if (_WIN32_WINNT < 0x0601)
+#define AF_MAX 33
+#else
+#define AF_LINK 33
+#define AF_MAX 34
+#endif /* (_WIN32_WINNT < 0x0601) */
+
+#endif /* (_WIN32_WINNT < 0x0600) */
+
+#endif /* (_WIN32_WINNT < 0x0501) */
+
+#define SOCK_STREAM 1
+#define SOCK_DGRAM 2
+#define SOCK_RAW 3
+#define SOCK_RDM 4
+#define SOCK_SEQPACKET 5
+
+#define SOL_SOCKET 0xffff
+
+#define SO_DEBUG 0x0001
+#define SO_ACCEPTCONN 0x0002
+#define SO_REUSEADDR 0x0004
+#define SO_KEEPALIVE 0x0008
+#define SO_DONTROUTE 0x0010
+#define SO_BROADCAST 0x0020
+#define SO_USELOOPBACK 0x0040
+#define SO_LINGER 0x0080
+#define SO_OOBINLINE 0x0100
+
+#define SO_DONTLINGER (int)(~SO_LINGER)
+#define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR))
+
+#define SO_SNDBUF 0x1001
+#define SO_RCVBUF 0x1002
+#define SO_SNDLOWAT 0x1003
+#define SO_RCVLOWAT 0x1004
+#define SO_SNDTIMEO 0x1005
+#define SO_RCVTIMEO 0x1006
+#define SO_ERROR 0x1007
+#define SO_TYPE 0x1008
+#define SO_BSP_STATE 0x1009
+
+#define SO_GROUP_ID 0x2001
+#define SO_GROUP_PRIORITY 0x2002
+#define SO_MAX_MSG_SIZE 0x2003
+
+#define SO_CONDITIONAL_ACCEPT 0x3002
+#define SO_PAUSE_ACCEPT 0x3003
+#define SO_COMPARTMENT_ID 0x3004
+#if (_WIN32_WINNT >= 0x0600)
+#define SO_RANDOMIZE_PORT 0x3005
+#define SO_PORT_SCALABILITY 0x3006
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#define WSK_SO_BASE 0x4000
+
+#define TCP_NODELAY 0x0001
+
+#define _SS_MAXSIZE 128
+#define _SS_ALIGNSIZE (sizeof(__int64))
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(USHORT))
+#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof(USHORT) + _SS_PAD1SIZE + _SS_ALIGNSIZE))
+
+#else
+
+#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (short))
+#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (short) + _SS_PAD1SIZE + _SS_ALIGNSIZE))
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#define IOC_UNIX 0x00000000
+#define IOC_WS2 0x08000000
+#define IOC_PROTOCOL 0x10000000
+#define IOC_VENDOR 0x18000000
+
+#if (_WIN32_WINNT >= 0x0600)
+#define IOC_WSK (IOC_WS2|0x07000000)
#endif
+#define _WSAIO(x,y) (IOC_VOID|(x)|(y))
+#define _WSAIOR(x,y) (IOC_OUT|(x)|(y))
+#define _WSAIOW(x,y) (IOC_IN|(x)|(y))
+#define _WSAIORW(x,y) (IOC_INOUT|(x)|(y))
+
+#define SIO_ASSOCIATE_HANDLE _WSAIOW(IOC_WS2,1)
+#define SIO_ENABLE_CIRCULAR_QUEUEING _WSAIO(IOC_WS2,2)
+#define SIO_FIND_ROUTE _WSAIOR(IOC_WS2,3)
+#define SIO_FLUSH _WSAIO(IOC_WS2,4)
+#define SIO_GET_BROADCAST_ADDRESS _WSAIOR(IOC_WS2,5)
+#define SIO_GET_EXTENSION_FUNCTION_POINTER _WSAIORW(IOC_WS2,6)
+#define SIO_GET_QOS _WSAIORW(IOC_WS2,7)
+#define SIO_GET_GROUP_QOS _WSAIORW(IOC_WS2,8)
+#define SIO_MULTIPOINT_LOOPBACK _WSAIOW(IOC_WS2,9)
+#define SIO_MULTICAST_SCOPE _WSAIOW(IOC_WS2,10)
+#define SIO_SET_QOS _WSAIOW(IOC_WS2,11)
+#define SIO_SET_GROUP_QOS _WSAIOW(IOC_WS2,12)
+#define SIO_TRANSLATE_HANDLE _WSAIORW(IOC_WS2,13)
+#define SIO_ROUTING_INTERFACE_QUERY _WSAIORW(IOC_WS2,20)
+#define SIO_ROUTING_INTERFACE_CHANGE _WSAIOW(IOC_WS2,21)
+#define SIO_ADDRESS_LIST_QUERY _WSAIOR(IOC_WS2,22)
+#define SIO_ADDRESS_LIST_CHANGE _WSAIO(IOC_WS2,23)
+#define SIO_QUERY_TARGET_PNP_HANDLE _WSAIOR(IOC_WS2,24)
+
+#if(_WIN32_WINNT >= 0x0501)
+#define SIO_ADDRESS_LIST_SORT _WSAIORW(IOC_WS2,25)
+#endif
+
+#if (_WIN32_WINNT >= 0x0600)
+#define SIO_RESERVED_1 _WSAIOW(IOC_WS2,26)
+#define SIO_RESERVED_2 _WSAIOW(IOC_WS2,33)
+#endif
+
+#define IPPROTO_IP 0
+
+#define IPPORT_TCPMUX 1
+#define IPPORT_ECHO 7
+#define IPPORT_DISCARD 9
+#define IPPORT_SYSTAT 11
+#define IPPORT_DAYTIME 13
+#define IPPORT_NETSTAT 15
+#define IPPORT_QOTD 17
+#define IPPORT_MSP 18
+#define IPPORT_CHARGEN 19
+#define IPPORT_FTP_DATA 20
+#define IPPORT_FTP 21
+#define IPPORT_TELNET 23
+#define IPPORT_SMTP 25
+#define IPPORT_TIMESERVER 37
+#define IPPORT_NAMESERVER 42
+#define IPPORT_WHOIS 43
+#define IPPORT_MTP 57
+
+#define IPPORT_TFTP 69
+#define IPPORT_RJE 77
+#define IPPORT_FINGER 79
+#define IPPORT_TTYLINK 87
+#define IPPORT_SUPDUP 95
+
+#define IPPORT_POP3 110
+#define IPPORT_NTP 123
+#define IPPORT_EPMAP 135
+#define IPPORT_NETBIOS_NS 137
+#define IPPORT_NETBIOS_DGM 138
+#define IPPORT_NETBIOS_SSN 139
+#define IPPORT_IMAP 143
+#define IPPORT_SNMP 161
+#define IPPORT_SNMP_TRAP 162
+#define IPPORT_IMAP3 220
+#define IPPORT_LDAP 389
+#define IPPORT_HTTPS 443
+#define IPPORT_MICROSOFT_DS 445
+#define IPPORT_EXECSERVER 512
+#define IPPORT_LOGINSERVER 513
+#define IPPORT_CMDSERVER 514
+#define IPPORT_EFSSERVER 520
+
+#define IPPORT_BIFFUDP 512
+#define IPPORT_WHOSERVER 513
+#define IPPORT_ROUTESERVER 520
+#define IPPORT_RESERVED 1024
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define IPPORT_REGISTERED_MIN IPPORT_RESERVED
+#define IPPORT_REGISTERED_MAX 0xbfff
+#define IPPORT_DYNAMIC_MIN 0xc000
+#define IPPORT_DYNAMIC_MAX 0xffff
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#define IN_CLASSA(i) (((LONG)(i) & 0x80000000) == 0)
+#define IN_CLASSA_NET 0xff000000
+#define IN_CLASSA_NSHIFT 24
+#define IN_CLASSA_HOST 0x00ffffff
+#define IN_CLASSA_MAX 128
+
+#define IN_CLASSB(i) (((LONG)(i) & 0xc0000000) == 0x80000000)
+#define IN_CLASSB_NET 0xffff0000
+#define IN_CLASSB_NSHIFT 16
+#define IN_CLASSB_HOST 0x0000ffff
+#define IN_CLASSB_MAX 65536
+
+#define IN_CLASSC(i) (((LONG)(i) & 0xe0000000) == 0xc0000000)
+#define IN_CLASSC_NET 0xffffff00
+#define IN_CLASSC_NSHIFT 8
+#define IN_CLASSC_HOST 0x000000ff
+
+#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000)
+#define IN_CLASSD_NET 0xf0000000
+#define IN_CLASSD_NSHIFT 28
+#define IN_CLASSD_HOST 0x0fffffff
+#define IN_MULTICAST(i) IN_CLASSD(i)
+
+#define INADDR_ANY (ULONG)0x00000000
+#define INADDR_LOOPBACK 0x7f000001
+#define INADDR_BROADCAST (ULONG)0xffffffff
+#define INADDR_NONE 0xffffffff
+
+#define SCOPEID_UNSPECIFIED_INIT {0}
+
+#define IOCPARM_MASK 0x7f
+#define IOC_VOID 0x20000000
+#define IOC_OUT 0x40000000
+#define IOC_IN 0x80000000
+#define IOC_INOUT (IOC_IN|IOC_OUT)
+
+#define _IO(x,y) (IOC_VOID|((x)<<8)|(y))
+#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+
+#define MSG_TRUNC 0x0100
+#define MSG_CTRUNC 0x0200
+#define MSG_BCAST 0x0400
+#define MSG_MCAST 0x0800
+
+#define AI_PASSIVE 0x00000001
+#define AI_CANONNAME 0x00000002
+#define AI_NUMERICHOST 0x00000004
+#define AI_NUMERICSERV 0x00000008
+
+#define AI_ALL 0x00000100
+#define AI_ADDRCONFIG 0x00000400
+#define AI_V4MAPPED 0x00000800
+
+#define AI_NON_AUTHORITATIVE 0x00004000
+#define AI_SECURE 0x00008000
+#define AI_RETURN_PREFERRED_NAMES 0x00010000
+
+#define AI_FQDN 0x00020000
+#define AI_FILESERVER 0x00040000
+
+#define NS_ALL 0
+
+#define NS_SAP 1
+#define NS_NDS 2
+#define NS_PEER_BROWSE 3
+#define NS_SLP 5
+#define NS_DHCP 6
+
+#define NS_TCPIP_LOCAL 10
+#define NS_TCPIP_HOSTS 11
+#define NS_DNS 12
+#define NS_NETBT 13
+#define NS_WINS 14
+
+#if(_WIN32_WINNT >= 0x0501)
+#define NS_NLA 15
+#endif
+
+#if(_WIN32_WINNT >= 0x0600)
+#define NS_BTH 16
+#endif
+
+#define NS_NBP 20
+
+#define NS_MS 30
+#define NS_STDA 31
+#define NS_NTDS 32
+
+#if(_WIN32_WINNT >= 0x0600)
+#define NS_EMAIL 37
+#define NS_PNRPNAME 38
+#define NS_PNRPCLOUD 39
+#endif
+
+#define NS_X500 40
+#define NS_NIS 41
+#define NS_NISPLUS 42
+
+#define NS_WRQ 50
+
+#define NS_NETDES 60
+
+#define NI_NOFQDN 0x01
+#define NI_NUMERICHOST 0x02
+#define NI_NAMEREQD 0x04
+#define NI_NUMERICSERV 0x08
+#define NI_DGRAM 0x10
+
+#define NI_MAXHOST 1025
+#define NI_MAXSERV 32
+
+typedef struct sockaddr {
+#if (_WIN32_WINNT < 0x0600)
+ u_short sa_family;
+#else
+ ADDRESS_FAMILY sa_family;
+#endif
+ CHAR sa_data[14];
+} SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;
+
+#ifndef __CSADDR_DEFINED__
+#define __CSADDR_DEFINED__
+
+typedef struct _SOCKET_ADDRESS {
+ LPSOCKADDR lpSockaddr;
+ INT iSockaddrLength;
+} SOCKET_ADDRESS, *PSOCKET_ADDRESS, *LPSOCKET_ADDRESS;
+
+typedef struct _SOCKET_ADDRESS_LIST {
+ INT iAddressCount;
+ SOCKET_ADDRESS Address[1];
+} SOCKET_ADDRESS_LIST, *PSOCKET_ADDRESS_LIST, FAR *LPSOCKET_ADDRESS_LIST;
+
+#if (_WIN32_WINNT >= 0x0600)
+#define SIZEOF_SOCKET_ADDRESS_LIST(AddressCount) \
+ (FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address) + \
+ AddressCount * sizeof(SOCKET_ADDRESS))
+#endif
+
+typedef struct _CSADDR_INFO {
+ SOCKET_ADDRESS LocalAddr;
+ SOCKET_ADDRESS RemoteAddr;
+ INT iSocketType;
+ INT iProtocol;
+} CSADDR_INFO, *PCSADDR_INFO, FAR *LPCSADDR_INFO ;
+
+#endif /* __CSADDR_DEFINED__ */
+
+typedef struct sockaddr_storage {
+ ADDRESS_FAMILY ss_family;
+ CHAR __ss_pad1[_SS_PAD1SIZE];
+ __int64 __ss_align;
+ CHAR __ss_pad2[_SS_PAD2SIZE];
+} SOCKADDR_STORAGE_LH, *PSOCKADDR_STORAGE_LH, FAR *LPSOCKADDR_STORAGE_LH;
+
+typedef struct sockaddr_storage_xp {
+ short ss_family;
+ CHAR __ss_pad1[_SS_PAD1SIZE];
+ __int64 __ss_align;
+ CHAR __ss_pad2[_SS_PAD2SIZE];
+} SOCKADDR_STORAGE_XP, *PSOCKADDR_STORAGE_XP, FAR *LPSOCKADDR_STORAGE_XP;
+
+#if (_WIN32_WINNT >= 0x0600)
+
+typedef SOCKADDR_STORAGE_LH SOCKADDR_STORAGE;
+typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE;
+
+#elif (_WIN32_WINNT >= 0x0501)
+
+typedef SOCKADDR_STORAGE_XP SOCKADDR_STORAGE;
+typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE;
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+typedef enum {
+#if (_WIN32_WINNT >= 0x0501)
+ IPPROTO_HOPOPTS = 0,
+#endif
+ IPPROTO_ICMP = 1,
+ IPPROTO_IGMP = 2,
+ IPPROTO_GGP = 3,
+#if (_WIN32_WINNT >= 0x0501)
+ IPPROTO_IPV4 = 4,
+#endif
+#if (_WIN32_WINNT >= 0x0600)
+ IPPROTO_ST = 5,
+#endif
+ IPPROTO_TCP = 6,
+#if (_WIN32_WINNT >= 0x0600)
+ IPPROTO_CBT = 7,
+ IPPROTO_EGP = 8,
+ IPPROTO_IGP = 9,
+#endif
+ IPPROTO_PUP = 12,
+ IPPROTO_UDP = 17,
+ IPPROTO_IDP = 22,
+#if (_WIN32_WINNT >= 0x0600)
+ IPPROTO_RDP = 27,
+#endif
+#if (_WIN32_WINNT >= 0x0501)
+ IPPROTO_IPV6 = 41,
+ IPPROTO_ROUTING = 43,
+ IPPROTO_FRAGMENT = 44,
+ IPPROTO_ESP = 50,
+ IPPROTO_AH = 51,
+ IPPROTO_ICMPV6 = 58,
+ IPPROTO_NONE = 59,
+ IPPROTO_DSTOPTS = 60,
+#endif /* (_WIN32_WINNT >= 0x0501) */
+ IPPROTO_ND = 77,
+#if(_WIN32_WINNT >= 0x0501)
+ IPPROTO_ICLFXBM = 78,
+#endif
+#if (_WIN32_WINNT >= 0x0600)
+ IPPROTO_PIM = 103,
+ IPPROTO_PGM = 113,
+ IPPROTO_L2TP = 115,
+ IPPROTO_SCTP = 132,
+#endif /* (_WIN32_WINNT >= 0x0600) */
+ IPPROTO_RAW = 255,
+ IPPROTO_MAX = 256,
+ IPPROTO_RESERVED_RAW = 257,
+ IPPROTO_RESERVED_IPSEC = 258,
+ IPPROTO_RESERVED_IPSECOFFLOAD = 259,
+ IPPROTO_RESERVED_MAX = 260
+} IPPROTO, *PIPROTO;
+
+typedef enum {
+ ScopeLevelInterface = 1,
+ ScopeLevelLink = 2,
+ ScopeLevelSubnet = 3,
+ ScopeLevelAdmin = 4,
+ ScopeLevelSite = 5,
+ ScopeLevelOrganization = 8,
+ ScopeLevelGlobal = 14,
+ ScopeLevelCount = 16
+} SCOPE_LEVEL;
+
+typedef struct {
+ union {
+ struct {
+ ULONG Zone:28;
+ ULONG Level:4;
+ };
+ ULONG Value;
+ };
+} SCOPE_ID, *PSCOPE_ID;
+
+typedef struct sockaddr_in {
+#if(_WIN32_WINNT < 0x0600)
+ short sin_family;
+#else
+ ADDRESS_FAMILY sin_family;
+#endif
+ USHORT sin_port;
+ IN_ADDR sin_addr;
+ CHAR sin_zero[8];
+} SOCKADDR_IN, *PSOCKADDR_IN;
+
+#if(_WIN32_WINNT >= 0x0601)
+typedef struct sockaddr_dl {
+ ADDRESS_FAMILY sdl_family;
+ UCHAR sdl_data[8];
+ UCHAR sdl_zero[4];
+} SOCKADDR_DL, *PSOCKADDR_DL;
+#endif
+
+typedef struct _WSABUF {
+ ULONG len;
+ CHAR FAR *buf;
+} WSABUF, FAR * LPWSABUF;
+
+typedef struct _WSAMSG {
+ LPSOCKADDR name;
+ INT namelen;
+ LPWSABUF lpBuffers;
+#if (_WIN32_WINNT >= 0x0600)
+ ULONG dwBufferCount;
+#else
+ DWORD dwBufferCount;
+#endif
+ WSABUF Control;
+#if (_WIN32_WINNT >= 0x0600)
+ ULONG dwFlags;
+#else
+ DWORD dwFlags;
+#endif
+} WSAMSG, *PWSAMSG, *FAR LPWSAMSG;
+
+#if (_WIN32_WINNT >= 0x0600)
+#define _WSACMSGHDR cmsghdr
+#endif
+
+typedef struct _WSACMSGHDR {
+ SIZE_T cmsg_len;
+ INT cmsg_level;
+ INT cmsg_type;
+} WSACMSGHDR, *PWSACMSGHDR, FAR *LPWSACMSGHDR;
+
+#if (_WIN32_WINNT >= 0x0600)
+typedef WSACMSGHDR CMSGHDR, *PCMSGHDR;
+#endif
+
+#define WSA_CMSGHDR_ALIGN(length) (((length) + TYPE_ALIGNMENT(WSACMSGHDR)-1) & \
+ (~(TYPE_ALIGNMENT(WSACMSGHDR)-1)))
+
+#define WSA_CMSGDATA_ALIGN(length) (((length) + MAX_NATURAL_ALIGNMENT-1) & \
+ (~(MAX_NATURAL_ALIGNMENT-1)))
+
+#if(_WIN32_WINNT >= 0x0600)
+#define CMSGHDR_ALIGN WSA_CMSGHDR_ALIGN
+#define CMSGDATA_ALIGN WSA_CMSGDATA_ALIGN
+#endif
+
+/*
+ * WSA_CMSG_FIRSTHDR
+ *
+ * Returns a pointer to the first ancillary data object,
+ * or a null pointer if there is no ancillary data in the
+ * control buffer of the WSAMSG structure.
+ *
+ * LPCMSGHDR
+ * WSA_CMSG_FIRSTHDR (
+ * LPWSAMSG msg
+ * );
+ */
+#define WSA_CMSG_FIRSTHDR(msg) (((msg)->Control.len >= sizeof(WSACMSGHDR)) \
+ ? (LPWSACMSGHDR)(msg)->Control.buf \
+ : (LPWSACMSGHDR)NULL)
+
+#if(_WIN32_WINNT >= 0x0600)
+#define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR
+#endif
+
+/*
+ * WSA_CMSG_NXTHDR
+ *
+ * Returns a pointer to the next ancillary data object,
+ * or a null if there are no more data objects.
+ *
+ * LPCMSGHDR
+ * WSA_CMSG_NEXTHDR (
+ * LPWSAMSG msg,
+ * LPWSACMSGHDR cmsg
+ * );
+ */
+#define WSA_CMSG_NXTHDR(msg, cmsg) \
+ ( ((cmsg) == NULL) \
+ ? WSA_CMSG_FIRSTHDR(msg) \
+ : ( ( ((PUCHAR)(cmsg) + \
+ WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len) + \
+ sizeof(WSACMSGHDR) ) > \
+ (PUCHAR)((msg)->Control.buf) + \
+ (msg)->Control.len ) \
+ ? (LPWSACMSGHDR)NULL \
+ : (LPWSACMSGHDR)((PUCHAR)(cmsg) + \
+ WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len)) ) )
+
+#if(_WIN32_WINNT >= 0x0600)
+#define CMSG_NXTHDR WSA_CMSG_NXTHDR
+#endif
+
+/*
+ * WSA_CMSG_DATA
+ *
+ * Returns a pointer to the first byte of data (what is referred
+ * to as the cmsg_data member though it is not defined in
+ * the structure).
+ *
+ * Note that RFC 2292 defines this as CMSG_DATA, but that name
+ * is already used by wincrypt.h, and so Windows has used WSA_CMSG_DATA.
+ *
+ * PUCHAR
+ * WSA_CMSG_DATA (
+ * LPWSACMSGHDR pcmsg
+ * );
+ */
+#define WSA_CMSG_DATA(cmsg) ((PUCHAR)(cmsg) + WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)))
+
+/*
+ * WSA_CMSG_SPACE
+ *
+ * Returns total size of an ancillary data object given
+ * the amount of data. Used to allocate the correct amount
+ * of space.
+ *
+ * SIZE_T
+ * WSA_CMSG_SPACE (
+ * SIZE_T length
+ * );
+ */
+#define WSA_CMSG_SPACE(length) (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR) + WSA_CMSGHDR_ALIGN(length)))
+
+#if(_WIN32_WINNT >= 0x0600)
+#define CMSG_SPACE WSA_CMSG_SPACE
+#endif
+
+/*
+ * WSA_CMSG_LEN
+ *
+ * Returns the value to store in cmsg_len given the amount of data.
+ *
+ * SIZE_T
+ * WSA_CMSG_LEN (
+ * SIZE_T length
+ * );
+ */
+#define WSA_CMSG_LEN(length) (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) + length)
+
+#if(_WIN32_WINNT >= 0x0600)
+#define CMSG_LEN WSA_CMSG_LEN
+#endif
+
+typedef struct addrinfo {
+ int ai_flags;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ size_t ai_addrlen;
+ char *ai_canonname;
+ struct sockaddr *ai_addr;
+ struct addrinfo *ai_next;
+} ADDRINFOA, *PADDRINFOA;
+
+typedef struct addrinfoW {
+ int ai_flags;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ size_t ai_addrlen;
+ PWSTR ai_canonname;
+ struct sockaddr *ai_addr;
+ struct addrinfoW *ai_next;
+} ADDRINFOW, *PADDRINFOW;
+
+#if (_WIN32_WINNT >= 0x0600)
+
+typedef struct addrinfoexA {
+ int ai_flags;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ size_t ai_addrlen;
+ char *ai_canonname;
+ struct sockaddr *ai_addr;
+ void *ai_blob;
+ size_t ai_bloblen;
+ LPGUID ai_provider;
+ struct addrinfoexA *ai_next;
+} ADDRINFOEXA, *PADDRINFOEXA, *LPADDRINFOEXA;
+
+typedef struct addrinfoexW {
+ int ai_flags;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ size_t ai_addrlen;
+ PWSTR ai_canonname;
+ struct sockaddr *ai_addr;
+ void *ai_blob;
+ size_t ai_bloblen;
+ LPGUID ai_provider;
+ struct addrinfoexW *ai_next;
+} ADDRINFOEXW, *PADDRINFOEXW, *LPADDRINFOEXW;
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#ifdef __cplusplus
+}
#endif