WS2tcpip.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:17k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /*
  2. **  WS2TCPIP.H - WinSock2 Extension for TCP/IP protocols
  3. **
  4. **  This file contains TCP/IP specific information for use
  5. **  by WinSock2 compatible applications.
  6. **
  7. ** Copyright (c) Microsoft Corporation. All rights reserved.
  8. **
  9. **  To provide the backward compatibility, all the TCP/IP
  10. **  specific definitions that were included in the WINSOCK.H
  11. **   file are now included in WINSOCK2.H file. WS2TCPIP.H
  12. **  file includes only the definitions  introduced in the
  13. **  "WinSock 2 Protocol-Specific Annex" document.
  14. **
  15. **  Rev 0.3 Nov 13, 1995
  16. **      Rev 0.4 Dec 15, 1996
  17. */
  18. #ifndef _WS2TCPIP_H_
  19. #define _WS2TCPIP_H_
  20. #if _MSC_VER > 1000
  21. #pragma once
  22. #endif
  23. /* Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP */
  24. struct ip_mreq {
  25.     struct in_addr imr_multiaddr;   /* IP multicast address of group */
  26.     struct in_addr imr_interface;   /* local IP address of interface */
  27. };
  28. /* Argument structure for IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP,
  29.  * IP_BLOCK_SOURCE, and IP_UNBLOCK_SOURCE
  30.  */
  31. struct ip_mreq_source {
  32.     struct in_addr imr_multiaddr;   /* IP multicast address of group */
  33.     struct in_addr imr_sourceaddr;  /* IP address of source          */
  34.     struct in_addr imr_interface;   /* local IP address of interface */
  35. };
  36. /* Argument structure for SIO_{GET,SET}_MULTICAST_FILTER */
  37. struct ip_msfilter {
  38.     struct in_addr imsf_multiaddr;  /* IP multicast address of group */
  39.     struct in_addr imsf_interface;  /* local IP address of interface */
  40.     u_long         imsf_fmode;      /* filter mode - INCLUDE or EXCLUDE */
  41.     u_long         imsf_numsrc;     /* number of sources in src_list */
  42.     struct in_addr imsf_slist[1];
  43. };
  44. #define IP_MSFILTER_SIZE(numsrc) 
  45.     (sizeof(struct ip_msfilter)-sizeof(struct in_addr) + (numsrc)*sizeof(struct in_addr))
  46. #define MCAST_INCLUDE 0
  47. #define MCAST_EXCLUDE 1
  48. /* TCP/IP specific Ioctl codes */
  49. #define SIO_GET_INTERFACE_LIST  _IOR('t', 127, u_long)
  50. /* New IOCTL with address size independent address array */
  51. #define SIO_GET_INTERFACE_LIST_EX  _IOR('t', 126, u_long)
  52. #define SIO_SET_MULTICAST_FILTER   _IOW('t', 125, u_long)
  53. #define SIO_GET_MULTICAST_FILTER   _IOW('t', 124 | IOC_IN, u_long)
  54. /* Option to use with [gs]etsockopt at the IPPROTO_IP level */
  55. #define IP_OPTIONS      1 /* set/get IP options */
  56. #define IP_HDRINCL      2 /* header is included with data */
  57. #define IP_TOS          3 /* IP type of service and preced*/
  58. #define IP_TTL          4 /* IP time to live */
  59. #define IP_MULTICAST_IF     9 /* set/get IP multicast i/f  */
  60. #define IP_MULTICAST_TTL       10 /* set/get IP multicast ttl */
  61. #define IP_MULTICAST_LOOP      11 /*set/get IP multicast loopback */
  62. #define IP_ADD_MEMBERSHIP      12 /* add an IP group membership */
  63. #define IP_DROP_MEMBERSHIP     13/* drop an IP group membership */
  64. #define IP_DONTFRAGMENT     14 /* don't fragment IP datagrams */
  65. #define IP_ADD_SOURCE_MEMBERSHIP  15 /* join IP group/source */
  66. #define IP_DROP_SOURCE_MEMBERSHIP 16 /* leave IP group/source */
  67. #define IP_BLOCK_SOURCE           17 /* block IP group/source */
  68. #define IP_UNBLOCK_SOURCE         18 /* unblock IP group/source */
  69. #define IP_PKTINFO                19 /* receive packet information for ipv4*/
  70. /* Option to use with [gs]etsockopt at the IPPROTO_IPV6 level */
  71. #define IPV6_HDRINCL            2  /* Header is included with data */
  72. #define IPV6_UNICAST_HOPS       4  /* Set/get IP unicast hop limit */
  73. #define IPV6_MULTICAST_IF       9  /* Set/get IP multicast interface */
  74. #define IPV6_MULTICAST_HOPS     10 /* Set/get IP multicast ttl */
  75. #define IPV6_MULTICAST_LOOP     11 /* Set/get IP multicast loopback */
  76. #define IPV6_ADD_MEMBERSHIP     12 /* Add an IP group membership */
  77. #define IPV6_DROP_MEMBERSHIP    13 /* Drop an IP group membership */
  78. #define IPV6_JOIN_GROUP         IPV6_ADD_MEMBERSHIP
  79. #define IPV6_LEAVE_GROUP        IPV6_DROP_MEMBERSHIP
  80. #define IPV6_PKTINFO            19 /* Receive packet information for ipv6 */
  81. /* Option to use with [gs]etsockopt at the IPPROTO_UDP level */
  82. #define UDP_NOCHECKSUM  1
  83. #define UDP_CHECKSUM_COVERAGE   20  /* Set/get UDP-Lite checksum coverage */
  84. /* Option to use with [gs]etsockopt at the IPPROTO_TCP level */
  85. #define  TCP_EXPEDITED_1122 0x0002
  86. /* IPv6 definitions */
  87. #ifndef s6_addr
  88. struct in6_addr {
  89.     union {
  90.         u_char Byte[16];
  91.         u_short Word[8];
  92.     } u;
  93. };
  94. #define in_addr6 in6_addr
  95. /*
  96. ** Defines to match RFC 2553.
  97. */
  98. #define _S6_un     u
  99. #define _S6_u8     Byte
  100. #define s6_addr    _S6_un._S6_u8
  101. /*
  102. ** Defines for our implementation.
  103. */
  104. #define s6_bytes   u.Byte
  105. #define s6_words   u.Word
  106. #endif
  107. /* Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP */
  108. typedef struct ipv6_mreq {
  109.     struct in6_addr ipv6mr_multiaddr;  /* IPv6 multicast address */
  110.     unsigned int    ipv6mr_interface;  /* Interface index */
  111. } IPV6_MREQ;
  112. /* Old IPv6 socket address structure (retained for sockaddr_gen definition below) */
  113. struct sockaddr_in6_old {
  114.                 short   sin6_family;    /* AF_INET6 */
  115.                 u_short sin6_port;      /* Transport level port number */
  116.                 u_long  sin6_flowinfo;  /* IPv6 flow information */
  117.                 struct in6_addr sin6_addr; /* IPv6 address */
  118. };
  119. /* IPv6 socket address structure, RFC 2553 */
  120. struct sockaddr_in6 {
  121.                 short   sin6_family;    /* AF_INET6 */
  122.                 u_short sin6_port;      /* Transport level port number */
  123.                 u_long  sin6_flowinfo;  /* IPv6 flow information */
  124.                 struct in6_addr sin6_addr; /* IPv6 address */
  125.         u_long sin6_scope_id;  /* set of interfaces for a scope */
  126. };
  127. typedef struct in6_addr IN6_ADDR;
  128. typedef struct in6_addr *PIN6_ADDR;
  129. typedef struct in6_addr FAR *LPIN6_ADDR;
  130. typedef struct sockaddr_in6 SOCKADDR_IN6;
  131. typedef struct sockaddr_in6 *PSOCKADDR_IN6;
  132. typedef struct sockaddr_in6 FAR *LPSOCKADDR_IN6;
  133. /* Macro that works for both IPv4 and IPv6 */
  134. #define SS_PORT(ssp) (((struct sockaddr_in*)(ssp))->sin_port)
  135. #define IN6ADDR_ANY_INIT        { 0 }
  136. #define IN6ADDR_LOOPBACK_INIT   { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }
  137. #ifdef  __cplusplus
  138. extern "C" {
  139. #endif
  140. extern const struct in6_addr in6addr_any;
  141. extern const struct in6_addr in6addr_loopback;
  142. #ifdef  __cplusplus
  143. }
  144. #endif
  145. #ifdef _MSC_VER
  146. #define WS2TCPIP_INLINE __inline
  147. #else
  148. #define WS2TCPIP_INLINE extern inline /* GNU style */
  149. #endif
  150. #define IN6ADDR_SETANY(x) {
  151. (x)->sin6_family = AF_INET6; 
  152. (x)->sin6_port = 0; 
  153. (x)->sin6_flowinfo = 0; 
  154. *((u_long *)((x)->sin6_addr.s6_addr)    ) = 0; 
  155. *((u_long *)((x)->sin6_addr.s6_addr) + 1) = 0; 
  156. *((u_long *)((x)->sin6_addr.s6_addr) + 2) = 0; 
  157. *((u_long *)((x)->sin6_addr.s6_addr) + 3) = 0; 
  158. }
  159. #define IN6ADDR_SETLOOPBACK(x) {
  160. (x)->sin6_family = AF_INET6; 
  161. (x)->sin6_port = 0; 
  162. (x)->sin6_flowinfo = 0; 
  163. *((u_long *)((x)->sin6_addr.s6_addr)    ) = 0; 
  164. *((u_long *)((x)->sin6_addr.s6_addr) + 1) = 0; 
  165. *((u_long *)((x)->sin6_addr.s6_addr) + 2) = 0; 
  166. *((u_long *)((x)->sin6_addr.s6_addr) + 3) = 1; 
  167. }
  168. #define IN6ADDR_ISANY(x) ( 
  169. (x)->sin6_family == AF_INET6 && 
  170. *((u_long *)((x)->sin6_addr.s6_addr)    ) == 0 && 
  171. *((u_long *)((x)->sin6_addr.s6_addr) + 1) == 0 && 
  172. *((u_long *)((x)->sin6_addr.s6_addr) + 2) == 0 && 
  173. *((u_long *)((x)->sin6_addr.s6_addr) + 3) == 0 
  174. )
  175. #define IN6ADDR_ISLOOPBACK(x) (
  176. (x)->sin6_family == AF_INET6 && 
  177. *((u_long *)((x)->sin6_addr.s6_addr)    ) == 0 && 
  178. *((u_long *)((x)->sin6_addr.s6_addr) + 1) == 0 && 
  179. *((u_long *)((x)->sin6_addr.s6_addr) + 2) == 0 && 
  180. *((u_long *)((x)->sin6_addr.s6_addr) + 3) == 1 
  181. )
  182. WS2TCPIP_INLINE int
  183. IN6_ADDR_EQUAL(const struct in6_addr *a, const struct in6_addr *b)
  184. {
  185.     return (memcmp(a, b, sizeof(struct in6_addr)) == 0);
  186. }
  187. #define IN6_IS_ADDR_UNSPECIFIED(a) IN6_ADDR_EQUAL((a), &in6addr_any)
  188. #define IN6_IS_ADDR_LOOPBACK(a)    IN6_ADDR_EQUAL((a), &in6addr_loopback)
  189. WS2TCPIP_INLINE int
  190. IN6_IS_ADDR_MULTICAST(const struct in6_addr *a)
  191. {
  192.     return (a->s6_bytes[0] == 0xff);
  193. }
  194. WS2TCPIP_INLINE int
  195. IN6_IS_ADDR_LINKLOCAL(const struct in6_addr *a)
  196. {
  197.     return ((a->s6_bytes[0] == 0xfe) &&
  198.             ((a->s6_bytes[1] & 0xc0) == 0x80));
  199. }
  200. WS2TCPIP_INLINE int
  201. IN6_IS_ADDR_SITELOCAL(const struct in6_addr *a)
  202. {
  203.     return ((a->s6_bytes[0] == 0xfe) &&
  204.             ((a->s6_bytes[1] & 0xc0) == 0xc0));
  205. }
  206. WS2TCPIP_INLINE int
  207. IN6_IS_ADDR_V4MAPPED(const struct in6_addr *a)
  208. {
  209.     return ((a->s6_words[0] == 0) &&
  210.             (a->s6_words[1] == 0) &&
  211.             (a->s6_words[2] == 0) &&
  212.             (a->s6_words[3] == 0) &&
  213.             (a->s6_words[4] == 0) &&
  214.             (a->s6_words[5] == 0xffff));
  215. }
  216. WS2TCPIP_INLINE int
  217. IN6_IS_ADDR_V4COMPAT(const struct in6_addr *a)
  218. {
  219.     return ((a->s6_words[0] == 0) &&
  220.             (a->s6_words[1] == 0) &&
  221.             (a->s6_words[2] == 0) &&
  222.             (a->s6_words[3] == 0) &&
  223.             (a->s6_words[4] == 0) &&
  224.             (a->s6_words[5] == 0) &&
  225.             !((a->s6_words[6] == 0) &&
  226.               (a->s6_addr[14] == 0) &&
  227.              ((a->s6_addr[15] == 0) || (a->s6_addr[15] == 1))));
  228. }
  229. WS2TCPIP_INLINE int
  230. IN6_IS_ADDR_MC_NODELOCAL(const struct in6_addr *a)
  231. {
  232.     return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_bytes[1] & 0xf) == 1);
  233. }
  234. WS2TCPIP_INLINE int
  235. IN6_IS_ADDR_MC_LINKLOCAL(const struct in6_addr *a)
  236. {
  237.     return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_bytes[1] & 0xf) == 2);
  238. }
  239. WS2TCPIP_INLINE int
  240. IN6_IS_ADDR_MC_SITELOCAL(const struct in6_addr *a)
  241. {
  242.     return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_bytes[1] & 0xf) == 5);
  243. }
  244. WS2TCPIP_INLINE int
  245. IN6_IS_ADDR_MC_ORGLOCAL(const struct in6_addr *a)
  246. {
  247.     return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_bytes[1] & 0xf) == 8);
  248. }
  249. WS2TCPIP_INLINE int
  250. IN6_IS_ADDR_MC_GLOBAL(const struct in6_addr *a)
  251. {
  252.     return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_bytes[1] & 0xf) == 0xe);
  253. }
  254. typedef union sockaddr_gen{
  255.         struct sockaddr Address;
  256.         struct sockaddr_in  AddressIn;
  257.         struct sockaddr_in6_old AddressIn6;
  258. } sockaddr_gen;
  259. /* Structure to keep interface specific information */
  260. typedef struct _INTERFACE_INFO
  261. {
  262.     u_long      iiFlags;        /* Interface flags */
  263.     sockaddr_gen    iiAddress;      /* Interface address */
  264.     sockaddr_gen    iiBroadcastAddress;     /* Broadcast address */
  265.     sockaddr_gen    iiNetmask;      /* Network mask */
  266. } INTERFACE_INFO, FAR * LPINTERFACE_INFO;
  267. /* New structure that does not have dependency on the address size */
  268. typedef struct _INTERFACE_INFO_EX
  269. {
  270.     u_long      iiFlags;        /* Interface flags */
  271.     SOCKET_ADDRESS  iiAddress;          /* Interface address */
  272.     SOCKET_ADDRESS  iiBroadcastAddress; /* Broadcast address */
  273.     SOCKET_ADDRESS  iiNetmask;          /* Network mask */
  274. } INTERFACE_INFO_EX, FAR * LPINTERFACE_INFO_EX;
  275. /* Possible flags for the  iiFlags - bitmask  */
  276. #define IFF_UP      0x00000001 /* Interface is up */
  277. #define IFF_BROADCAST   0x00000002 /* Broadcast is  supported */
  278. #define IFF_LOOPBACK    0x00000004 /* this is loopback interface */
  279. #define IFF_POINTTOPOINT 0x00000008 /*this is point-to-point interface*/
  280. #define IFF_MULTICAST   0x00000010 /* multicast is supported */
  281. // structure for IP_PKTINFO option
  282. //
  283. typedef struct in_pktinfo {
  284.     IN_ADDR ipi_addr; // destination IPv4 address
  285.     UINT    ipi_ifindex; // received interface index
  286. } IN_PKTINFO;
  287. C_ASSERT(sizeof(IN_PKTINFO) == 8);
  288. // structure for IPV6_PKTINFO option
  289. //
  290. typedef struct in6_pktinfo {
  291.     IN6_ADDR ipi6_addr; // destination IPv6 address
  292.     UINT     ipi6_ifindex; // received interface index
  293. } IN6_PKTINFO;
  294. C_ASSERT(sizeof(IN6_PKTINFO) == 20);
  295. /* Error codes from getaddrinfo() */
  296. #define EAI_AGAIN       WSATRY_AGAIN
  297. #define EAI_BADFLAGS    WSAEINVAL
  298. #define EAI_FAIL        WSANO_RECOVERY
  299. #define EAI_FAMILY      WSAEAFNOSUPPORT
  300. #define EAI_MEMORY      WSA_NOT_ENOUGH_MEMORY
  301. //#define EAI_NODATA      WSANO_DATA
  302. #define EAI_NONAME      WSAHOST_NOT_FOUND
  303. #define EAI_SERVICE     WSATYPE_NOT_FOUND
  304. #define EAI_SOCKTYPE    WSAESOCKTNOSUPPORT
  305. //
  306. //  DCR_FIX:  EAI_NODATA remove or fix
  307. //
  308. //  EAI_NODATA was removed from rfc2553bis
  309. //  need to find out from the authors why and
  310. //  determine the error for "no records of this type"
  311. //  temporarily, we'll keep #define to avoid changing
  312. //  code that could change back;  use NONAME
  313. //
  314. #define EAI_NODATA      EAI_NONAME
  315. /* Structure used in getaddrinfo() call */
  316. typedef struct addrinfo {
  317.     int ai_flags;              /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
  318.     int ai_family;             /* PF_xxx */
  319.     int ai_socktype;           /* SOCK_xxx */
  320.     int ai_protocol;           /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
  321.     size_t ai_addrlen;         /* Length of ai_addr */
  322.     char *ai_canonname;        /* Canonical name for nodename */
  323.     struct sockaddr *ai_addr;  /* Binary address */
  324.     struct addrinfo *ai_next;  /* Next structure in linked list */
  325. } ADDRINFO, FAR * LPADDRINFO;
  326. /* Flags used in "hints" argument to getaddrinfo() */
  327. #define AI_PASSIVE     0x1  /* Socket address will be used in bind() call */
  328. #define AI_CANONNAME   0x2  /* Return canonical name in first ai_canonname */
  329. #define AI_NUMERICHOST 0x4  /* Nodename must be a numeric address string */
  330. #ifdef __cplusplus
  331. extern "C" {
  332. #endif
  333. WINSOCK_API_LINKAGE
  334. int
  335. WSAAPI
  336. getaddrinfo(
  337.     IN const char FAR * nodename,
  338.     IN const char FAR * servname,
  339.     IN const struct addrinfo FAR * hints,
  340.     OUT struct addrinfo FAR * FAR * res
  341.     );
  342. #if INCL_WINSOCK_API_TYPEDEFS
  343. typedef
  344. int
  345. (WSAAPI * LPFN_GETADDRINFO)(
  346.     IN const char FAR * nodename,
  347.     IN const char FAR * servname,
  348.     IN const struct addrinfo FAR * hints,
  349.     OUT struct addrinfo FAR * FAR * res
  350.     );
  351. #endif
  352. WINSOCK_API_LINKAGE
  353. void
  354. WSAAPI
  355. freeaddrinfo(
  356.     IN struct addrinfo FAR * ai
  357.     );
  358. #if INCL_WINSOCK_API_TYPEDEFS
  359. typedef
  360. void
  361. (WSAAPI * LPFN_FREEADDRINFO)(
  362.     IN struct addrinfo FAR * ai
  363.     );
  364. #endif
  365. #if INCL_WINSOCK_API_PROTOTYPES
  366. #ifdef UNICODE
  367. #define gai_strerror   gai_strerrorW
  368. #else
  369. #define gai_strerror   gai_strerrorA
  370. #endif  /* UNICODE */
  371. // WARNING: The gai_strerror inline functions below use static buffers,
  372. // and hence are not thread-safe.  We'll use buffers long enough to hold
  373. // 1k characters.  Any system error messages longer than this will be
  374. // returned as empty strings.  However 1k should work for the error codes
  375. // used by getaddrinfo().
  376. #define GAI_STRERROR_BUFFER_SIZE 1024
  377. WS2TCPIP_INLINE
  378. char *
  379. gai_strerrorA(
  380.     IN int ecode)
  381. {
  382.     DWORD dwMsgLen;
  383.     static char buff[GAI_STRERROR_BUFFER_SIZE + 1];
  384.     dwMsgLen = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM
  385.                              |FORMAT_MESSAGE_IGNORE_INSERTS
  386.                              |FORMAT_MESSAGE_MAX_WIDTH_MASK,
  387.                               NULL,
  388.                               ecode,
  389.                               MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  390.                               (LPSTR)buff,
  391.                               GAI_STRERROR_BUFFER_SIZE,
  392.                               NULL);
  393.     return buff;
  394. }
  395. WS2TCPIP_INLINE
  396. WCHAR *
  397. gai_strerrorW(
  398.     IN int ecode
  399.     )
  400. {
  401.     DWORD dwMsgLen;
  402.     static WCHAR buff[GAI_STRERROR_BUFFER_SIZE + 1];
  403.     dwMsgLen = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
  404.                              |FORMAT_MESSAGE_IGNORE_INSERTS
  405.                              |FORMAT_MESSAGE_MAX_WIDTH_MASK,
  406.                               NULL,
  407.                               ecode,
  408.                               MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  409.                               (LPWSTR)buff,
  410.                               GAI_STRERROR_BUFFER_SIZE,
  411.                               NULL);
  412.     return buff;
  413. }
  414. #endif /* INCL_WINSOCK_API_PROTOTYPES */
  415. typedef int socklen_t;
  416. WINSOCK_API_LINKAGE
  417. int
  418. WSAAPI
  419. getnameinfo(
  420.     IN  const struct sockaddr FAR * sa,
  421.     IN  socklen_t       salen,
  422.     OUT char FAR *      host,
  423.     IN  DWORD           hostlen,
  424.     OUT char FAR *      serv,
  425.     IN  DWORD           servlen,
  426.     IN  int             flags
  427.     );
  428. #if INCL_WINSOCK_API_TYPEDEFS
  429. typedef
  430. int
  431. (WSAAPI * LPFN_GETNAMEINFO)(
  432.     IN  const struct sockaddr FAR * sa,
  433.     IN  socklen_t       salen,
  434.     OUT char FAR *      host,
  435.     IN  DWORD           hostlen,
  436.     OUT char FAR *      serv,
  437.     IN  DWORD           servlen,
  438.     IN  int             flags
  439.     );
  440. #endif
  441. #define NI_MAXHOST  1025  /* Max size of a fully-qualified domain name */
  442. #define NI_MAXSERV    32  /* Max size of a service name */
  443. #define INET_ADDRSTRLEN  16 /* Max size of numeric form of IPv4 address */
  444. #define INET6_ADDRSTRLEN 46 /* Max size of numeric form of IPv6 address */
  445. /* Flags for getnameinfo() */
  446. #define NI_NOFQDN       0x01  /* Only return nodename portion for local hosts */
  447. #define NI_NUMERICHOST  0x02  /* Return numeric form of the host's address */
  448. #define NI_NAMEREQD     0x04  /* Error if the host's name not in DNS */
  449. #define NI_NUMERICSERV  0x08  /* Return numeric form of the service (port #) */
  450. #define NI_DGRAM        0x10  /* Service is a datagram service */
  451. #ifdef __cplusplus
  452. }
  453. #endif
  454. //
  455. // Unless the build environment is explicitly targeting only
  456. // platforms that include built-in getaddrinfo() support, include
  457. // the backwards-compatibility version of the relevant APIs.
  458. //
  459. #if !defined(_WIN32_WINNT) || (_WIN32_WINNT <= 0x0500)
  460. #include <wspiapi.h>
  461. #endif
  462. #endif  /* _WS2TCPIP_H_ */