1 #pragma once 2 3 #define _WS2DEF_ 4 5 #ifdef __cplusplus 6 extern "C" { 7 #endif 8 9 #if !defined(_WINSOCK2API_) && defined(_WINSOCKAPI_) 10 #error Include only winsock2.h, not both winsock.h and ws2def.h in the same module. 11 #endif 12 13 #if (_WIN32_WINNT >= 0x0600) 14 15 #ifdef _MSC_VER 16 #define WS2DEF_INLINE __inline 17 #else 18 #define WS2DEF_INLINE extern inline 19 #endif 20 21 #endif/* (_WIN32_WINNT >= 0x0600) */ 22 23 #include <inaddr.h> 24 25 typedef USHORT ADDRESS_FAMILY; 26 27 #define AF_UNSPEC 0 28 #define AF_UNIX 1 29 #define AF_INET 2 30 #define AF_IMPLINK 3 31 #define AF_PUP 4 32 #define AF_CHAOS 5 33 #define AF_NS 6 34 #define AF_IPX AF_NS 35 #define AF_ISO 7 36 #define AF_OSI AF_ISO 37 #define AF_ECMA 8 38 #define AF_DATAKIT 9 39 #define AF_CCITT 10 40 #define AF_SNA 11 41 #define AF_DECnet 12 42 #define AF_DLI 13 43 #define AF_LAT 14 44 #define AF_HYLINK 15 45 #define AF_APPLETALK 16 46 #define AF_NETBIOS 17 47 #define AF_VOICEVIEW 18 48 #define AF_FIREFOX 19 49 #define AF_UNKNOWN1 20 50 #define AF_BAN 21 51 #define AF_ATM 22 52 #define AF_INET6 23 53 #define AF_CLUSTER 24 54 #define AF_12844 25 55 #define AF_IRDA 26 56 #define AF_NETDES 28 57 58 #if (_WIN32_WINNT < 0x0501) 59 60 #define AF_MAX 29 61 62 #else 63 64 #define AF_TCNPROCESS 29 65 #define AF_TCNMESSAGE 30 66 #define AF_ICLFXBM 31 67 68 #if(_WIN32_WINNT < 0x0600) 69 70 #define AF_MAX 32 71 72 #else 73 74 #define AF_BTH 32 75 #if (_WIN32_WINNT < 0x0601) 76 #define AF_MAX 33 77 #else 78 #define AF_LINK 33 79 #define AF_MAX 34 80 #endif /* (_WIN32_WINNT < 0x0601) */ 81 82 #endif /* (_WIN32_WINNT < 0x0600) */ 83 84 #endif /* (_WIN32_WINNT < 0x0501) */ 85 86 #define SOCK_STREAM 1 87 #define SOCK_DGRAM 2 88 #define SOCK_RAW 3 89 #define SOCK_RDM 4 90 #define SOCK_SEQPACKET 5 91 92 #define SOL_SOCKET 0xffff 93 94 #define SO_DEBUG 0x0001 95 #define SO_ACCEPTCONN 0x0002 96 #define SO_REUSEADDR 0x0004 97 #define SO_KEEPALIVE 0x0008 98 #define SO_DONTROUTE 0x0010 99 #define SO_BROADCAST 0x0020 100 #define SO_USELOOPBACK 0x0040 101 #define SO_LINGER 0x0080 102 #define SO_OOBINLINE 0x0100 103 104 #define SO_DONTLINGER (int)(~SO_LINGER) 105 #define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR)) 106 107 #define SO_SNDBUF 0x1001 108 #define SO_RCVBUF 0x1002 109 #define SO_SNDLOWAT 0x1003 110 #define SO_RCVLOWAT 0x1004 111 #define SO_SNDTIMEO 0x1005 112 #define SO_RCVTIMEO 0x1006 113 #define SO_ERROR 0x1007 114 #define SO_TYPE 0x1008 115 #define SO_BSP_STATE 0x1009 116 117 #define SO_GROUP_ID 0x2001 118 #define SO_GROUP_PRIORITY 0x2002 119 #define SO_MAX_MSG_SIZE 0x2003 120 121 #define SO_CONDITIONAL_ACCEPT 0x3002 122 #define SO_PAUSE_ACCEPT 0x3003 123 #define SO_COMPARTMENT_ID 0x3004 124 #if (_WIN32_WINNT >= 0x0600) 125 #define SO_RANDOMIZE_PORT 0x3005 126 #define SO_PORT_SCALABILITY 0x3006 127 #endif /* (_WIN32_WINNT >= 0x0600) */ 128 129 #define WSK_SO_BASE 0x4000 130 131 #define TCP_NODELAY 0x0001 132 133 #define _SS_MAXSIZE 128 134 #define _SS_ALIGNSIZE (sizeof(__int64)) 135 136 #if (_WIN32_WINNT >= 0x0600) 137 138 #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(USHORT)) 139 #define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof(USHORT) + _SS_PAD1SIZE + _SS_ALIGNSIZE)) 140 141 #else 142 143 #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (short)) 144 #define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (short) + _SS_PAD1SIZE + _SS_ALIGNSIZE)) 145 146 #endif /* (_WIN32_WINNT >= 0x0600) */ 147 148 #define IOC_UNIX 0x00000000 149 #define IOC_WS2 0x08000000 150 #define IOC_PROTOCOL 0x10000000 151 #define IOC_VENDOR 0x18000000 152 153 #if (_WIN32_WINNT >= 0x0600) 154 #define IOC_WSK (IOC_WS2|0x07000000) 155 #endif 156 157 #define _WSAIO(x,y) (IOC_VOID|(x)|(y)) 158 #define _WSAIOR(x,y) (IOC_OUT|(x)|(y)) 159 #define _WSAIOW(x,y) (IOC_IN|(x)|(y)) 160 #define _WSAIORW(x,y) (IOC_INOUT|(x)|(y)) 161 162 #define SIO_ASSOCIATE_HANDLE _WSAIOW(IOC_WS2,1) 163 #define SIO_ENABLE_CIRCULAR_QUEUEING _WSAIO(IOC_WS2,2) 164 #define SIO_FIND_ROUTE _WSAIOR(IOC_WS2,3) 165 #define SIO_FLUSH _WSAIO(IOC_WS2,4) 166 #define SIO_GET_BROADCAST_ADDRESS _WSAIOR(IOC_WS2,5) 167 #define SIO_GET_EXTENSION_FUNCTION_POINTER _WSAIORW(IOC_WS2,6) 168 #define SIO_GET_QOS _WSAIORW(IOC_WS2,7) 169 #define SIO_GET_GROUP_QOS _WSAIORW(IOC_WS2,8) 170 #define SIO_MULTIPOINT_LOOPBACK _WSAIOW(IOC_WS2,9) 171 #define SIO_MULTICAST_SCOPE _WSAIOW(IOC_WS2,10) 172 #define SIO_SET_QOS _WSAIOW(IOC_WS2,11) 173 #define SIO_SET_GROUP_QOS _WSAIOW(IOC_WS2,12) 174 #define SIO_TRANSLATE_HANDLE _WSAIORW(IOC_WS2,13) 175 #define SIO_ROUTING_INTERFACE_QUERY _WSAIORW(IOC_WS2,20) 176 #define SIO_ROUTING_INTERFACE_CHANGE _WSAIOW(IOC_WS2,21) 177 #define SIO_ADDRESS_LIST_QUERY _WSAIOR(IOC_WS2,22) 178 #define SIO_ADDRESS_LIST_CHANGE _WSAIO(IOC_WS2,23) 179 #define SIO_QUERY_TARGET_PNP_HANDLE _WSAIOR(IOC_WS2,24) 180 181 #if(_WIN32_WINNT >= 0x0501) 182 #define SIO_ADDRESS_LIST_SORT _WSAIORW(IOC_WS2,25) 183 #endif 184 185 #if (_WIN32_WINNT >= 0x0600) 186 #define SIO_RESERVED_1 _WSAIOW(IOC_WS2,26) 187 #define SIO_RESERVED_2 _WSAIOW(IOC_WS2,33) 188 #endif 189 190 #define IPPROTO_IP 0 191 192 #define IPPORT_TCPMUX 1 193 #define IPPORT_ECHO 7 194 #define IPPORT_DISCARD 9 195 #define IPPORT_SYSTAT 11 196 #define IPPORT_DAYTIME 13 197 #define IPPORT_NETSTAT 15 198 #define IPPORT_QOTD 17 199 #define IPPORT_MSP 18 200 #define IPPORT_CHARGEN 19 201 #define IPPORT_FTP_DATA 20 202 #define IPPORT_FTP 21 203 #define IPPORT_TELNET 23 204 #define IPPORT_SMTP 25 205 #define IPPORT_TIMESERVER 37 206 #define IPPORT_NAMESERVER 42 207 #define IPPORT_WHOIS 43 208 #define IPPORT_MTP 57 209 210 #define IPPORT_TFTP 69 211 #define IPPORT_RJE 77 212 #define IPPORT_FINGER 79 213 #define IPPORT_TTYLINK 87 214 #define IPPORT_SUPDUP 95 215 216 #define IPPORT_POP3 110 217 #define IPPORT_NTP 123 218 #define IPPORT_EPMAP 135 219 #define IPPORT_NETBIOS_NS 137 220 #define IPPORT_NETBIOS_DGM 138 221 #define IPPORT_NETBIOS_SSN 139 222 #define IPPORT_IMAP 143 223 #define IPPORT_SNMP 161 224 #define IPPORT_SNMP_TRAP 162 225 #define IPPORT_IMAP3 220 226 #define IPPORT_LDAP 389 227 #define IPPORT_HTTPS 443 228 #define IPPORT_MICROSOFT_DS 445 229 #define IPPORT_EXECSERVER 512 230 #define IPPORT_LOGINSERVER 513 231 #define IPPORT_CMDSERVER 514 232 #define IPPORT_EFSSERVER 520 233 234 #define IPPORT_BIFFUDP 512 235 #define IPPORT_WHOSERVER 513 236 #define IPPORT_ROUTESERVER 520 237 #define IPPORT_RESERVED 1024 238 239 #if (_WIN32_WINNT >= 0x0600) 240 241 #define IPPORT_REGISTERED_MIN IPPORT_RESERVED 242 #define IPPORT_REGISTERED_MAX 0xbfff 243 #define IPPORT_DYNAMIC_MIN 0xc000 244 #define IPPORT_DYNAMIC_MAX 0xffff 245 246 #endif /* (_WIN32_WINNT >= 0x0600) */ 247 248 #define IN_CLASSA(i) (((LONG)(i) & 0x80000000) == 0) 249 #define IN_CLASSA_NET 0xff000000 250 #define IN_CLASSA_NSHIFT 24 251 #define IN_CLASSA_HOST 0x00ffffff 252 #define IN_CLASSA_MAX 128 253 254 #define IN_CLASSB(i) (((LONG)(i) & 0xc0000000) == 0x80000000) 255 #define IN_CLASSB_NET 0xffff0000 256 #define IN_CLASSB_NSHIFT 16 257 #define IN_CLASSB_HOST 0x0000ffff 258 #define IN_CLASSB_MAX 65536 259 260 #define IN_CLASSC(i) (((LONG)(i) & 0xe0000000) == 0xc0000000) 261 #define IN_CLASSC_NET 0xffffff00 262 #define IN_CLASSC_NSHIFT 8 263 #define IN_CLASSC_HOST 0x000000ff 264 265 #define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000) 266 #define IN_CLASSD_NET 0xf0000000 267 #define IN_CLASSD_NSHIFT 28 268 #define IN_CLASSD_HOST 0x0fffffff 269 #define IN_MULTICAST(i) IN_CLASSD(i) 270 271 #define INADDR_ANY (ULONG)0x00000000 272 #define INADDR_LOOPBACK 0x7f000001 273 #define INADDR_BROADCAST (ULONG)0xffffffff 274 #define INADDR_NONE 0xffffffff 275 276 #define SCOPEID_UNSPECIFIED_INIT {0} 277 278 #define IOCPARM_MASK 0x7f 279 #define IOC_VOID 0x20000000 280 #define IOC_OUT 0x40000000 281 #define IOC_IN 0x80000000 282 #define IOC_INOUT (IOC_IN|IOC_OUT) 283 284 #define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) 285 #define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) 286 #define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) 287 288 #define MSG_TRUNC 0x0100 289 #define MSG_CTRUNC 0x0200 290 #define MSG_BCAST 0x0400 291 #define MSG_MCAST 0x0800 292 293 #define AI_PASSIVE 0x00000001 294 #define AI_CANONNAME 0x00000002 295 #define AI_NUMERICHOST 0x00000004 296 #define AI_NUMERICSERV 0x00000008 297 298 #define AI_ALL 0x00000100 299 #define AI_ADDRCONFIG 0x00000400 300 #define AI_V4MAPPED 0x00000800 301 302 #define AI_NON_AUTHORITATIVE 0x00004000 303 #define AI_SECURE 0x00008000 304 #define AI_RETURN_PREFERRED_NAMES 0x00010000 305 306 #define AI_FQDN 0x00020000 307 #define AI_FILESERVER 0x00040000 308 309 #define AI_DISABLE_IDN_ENCODING 0x00080000 310 311 #define NS_ALL 0 312 313 #define NS_SAP 1 314 #define NS_NDS 2 315 #define NS_PEER_BROWSE 3 316 #define NS_SLP 5 317 #define NS_DHCP 6 318 319 #define NS_TCPIP_LOCAL 10 320 #define NS_TCPIP_HOSTS 11 321 #define NS_DNS 12 322 #define NS_NETBT 13 323 #define NS_WINS 14 324 325 #if(_WIN32_WINNT >= 0x0501) 326 #define NS_NLA 15 327 #endif 328 329 #if(_WIN32_WINNT >= 0x0600) 330 #define NS_BTH 16 331 #endif 332 333 #define NS_NBP 20 334 335 #define NS_MS 30 336 #define NS_STDA 31 337 #define NS_NTDS 32 338 339 #if(_WIN32_WINNT >= 0x0600) 340 #define NS_EMAIL 37 341 #define NS_PNRPNAME 38 342 #define NS_PNRPCLOUD 39 343 #endif 344 345 #define NS_X500 40 346 #define NS_NIS 41 347 #define NS_NISPLUS 42 348 349 #define NS_WRQ 50 350 351 #define NS_NETDES 60 352 353 #define NI_NOFQDN 0x01 354 #define NI_NUMERICHOST 0x02 355 #define NI_NAMEREQD 0x04 356 #define NI_NUMERICSERV 0x08 357 #define NI_DGRAM 0x10 358 359 #define NI_MAXHOST 1025 360 #define NI_MAXSERV 32 361 362 typedef struct sockaddr { 363 #if (_WIN32_WINNT < 0x0600) 364 u_short sa_family; 365 #else 366 ADDRESS_FAMILY sa_family; 367 #endif 368 CHAR sa_data[14]; 369 } SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR; 370 371 #ifndef __CSADDR_DEFINED__ 372 #define __CSADDR_DEFINED__ 373 374 typedef struct _SOCKET_ADDRESS { 375 LPSOCKADDR lpSockaddr; 376 INT iSockaddrLength; 377 } SOCKET_ADDRESS, *PSOCKET_ADDRESS, *LPSOCKET_ADDRESS; 378 379 typedef struct _SOCKET_ADDRESS_LIST { 380 INT iAddressCount; 381 SOCKET_ADDRESS Address[1]; 382 } SOCKET_ADDRESS_LIST, *PSOCKET_ADDRESS_LIST, FAR *LPSOCKET_ADDRESS_LIST; 383 384 #if (_WIN32_WINNT >= 0x0600) 385 #define SIZEOF_SOCKET_ADDRESS_LIST(AddressCount) \ 386 (FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address) + \ 387 AddressCount * sizeof(SOCKET_ADDRESS)) 388 #endif 389 390 typedef struct _CSADDR_INFO { 391 SOCKET_ADDRESS LocalAddr; 392 SOCKET_ADDRESS RemoteAddr; 393 INT iSocketType; 394 INT iProtocol; 395 } CSADDR_INFO, *PCSADDR_INFO, FAR *LPCSADDR_INFO ; 396 397 #endif /* __CSADDR_DEFINED__ */ 398 399 typedef struct sockaddr_storage { 400 ADDRESS_FAMILY ss_family; 401 CHAR __ss_pad1[_SS_PAD1SIZE]; 402 __int64 __ss_align; 403 CHAR __ss_pad2[_SS_PAD2SIZE]; 404 } SOCKADDR_STORAGE_LH, *PSOCKADDR_STORAGE_LH, FAR *LPSOCKADDR_STORAGE_LH; 405 406 typedef struct sockaddr_storage_xp { 407 short ss_family; 408 CHAR __ss_pad1[_SS_PAD1SIZE]; 409 __int64 __ss_align; 410 CHAR __ss_pad2[_SS_PAD2SIZE]; 411 } SOCKADDR_STORAGE_XP, *PSOCKADDR_STORAGE_XP, FAR *LPSOCKADDR_STORAGE_XP; 412 413 #if (_WIN32_WINNT >= 0x0600) 414 415 typedef SOCKADDR_STORAGE_LH SOCKADDR_STORAGE; 416 typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE; 417 418 #elif (_WIN32_WINNT >= 0x0501) 419 420 typedef SOCKADDR_STORAGE_XP SOCKADDR_STORAGE; 421 typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE; 422 423 #endif /* (_WIN32_WINNT >= 0x0600) */ 424 425 typedef enum { 426 #if (_WIN32_WINNT >= 0x0501) 427 IPPROTO_HOPOPTS = 0, 428 #endif 429 IPPROTO_ICMP = 1, 430 IPPROTO_IGMP = 2, 431 IPPROTO_GGP = 3, 432 #if (_WIN32_WINNT >= 0x0501) 433 IPPROTO_IPV4 = 4, 434 #endif 435 #if (_WIN32_WINNT >= 0x0600) 436 IPPROTO_ST = 5, 437 #endif 438 IPPROTO_TCP = 6, 439 #if (_WIN32_WINNT >= 0x0600) 440 IPPROTO_CBT = 7, 441 IPPROTO_EGP = 8, 442 IPPROTO_IGP = 9, 443 #endif 444 IPPROTO_PUP = 12, 445 IPPROTO_UDP = 17, 446 IPPROTO_IDP = 22, 447 #if (_WIN32_WINNT >= 0x0600) 448 IPPROTO_RDP = 27, 449 #endif 450 #if (_WIN32_WINNT >= 0x0501) 451 IPPROTO_IPV6 = 41, 452 IPPROTO_ROUTING = 43, 453 IPPROTO_FRAGMENT = 44, 454 IPPROTO_ESP = 50, 455 IPPROTO_AH = 51, 456 IPPROTO_ICMPV6 = 58, 457 IPPROTO_NONE = 59, 458 IPPROTO_DSTOPTS = 60, 459 #endif /* (_WIN32_WINNT >= 0x0501) */ 460 IPPROTO_ND = 77, 461 #if(_WIN32_WINNT >= 0x0501) 462 IPPROTO_ICLFXBM = 78, 463 #endif 464 #if (_WIN32_WINNT >= 0x0600) 465 IPPROTO_PIM = 103, 466 IPPROTO_PGM = 113, 467 IPPROTO_L2TP = 115, 468 IPPROTO_SCTP = 132, 469 #endif /* (_WIN32_WINNT >= 0x0600) */ 470 IPPROTO_RAW = 255, 471 IPPROTO_MAX = 256, 472 IPPROTO_RESERVED_RAW = 257, 473 IPPROTO_RESERVED_IPSEC = 258, 474 IPPROTO_RESERVED_IPSECOFFLOAD = 259, 475 IPPROTO_RESERVED_MAX = 260 476 } IPPROTO, *PIPROTO; 477 478 typedef enum { 479 ScopeLevelInterface = 1, 480 ScopeLevelLink = 2, 481 ScopeLevelSubnet = 3, 482 ScopeLevelAdmin = 4, 483 ScopeLevelSite = 5, 484 ScopeLevelOrganization = 8, 485 ScopeLevelGlobal = 14, 486 ScopeLevelCount = 16 487 } SCOPE_LEVEL; 488 489 typedef struct { 490 union { 491 struct { 492 ULONG Zone:28; 493 ULONG Level:4; 494 }; 495 ULONG Value; 496 }; 497 } SCOPE_ID, *PSCOPE_ID; 498 499 typedef struct sockaddr_in { 500 #if(_WIN32_WINNT < 0x0600) 501 short sin_family; 502 #else 503 ADDRESS_FAMILY sin_family; 504 #endif 505 USHORT sin_port; 506 IN_ADDR sin_addr; 507 CHAR sin_zero[8]; 508 } SOCKADDR_IN, *PSOCKADDR_IN; 509 510 #if(_WIN32_WINNT >= 0x0601) 511 typedef struct sockaddr_dl { 512 ADDRESS_FAMILY sdl_family; 513 UCHAR sdl_data[8]; 514 UCHAR sdl_zero[4]; 515 } SOCKADDR_DL, *PSOCKADDR_DL; 516 #endif 517 518 typedef struct _WSABUF { 519 ULONG len; 520 CHAR FAR *buf; 521 } WSABUF, FAR * LPWSABUF; 522 523 typedef struct _WSAMSG { 524 LPSOCKADDR name; 525 INT namelen; 526 LPWSABUF lpBuffers; 527 #if (_WIN32_WINNT >= 0x0600) 528 ULONG dwBufferCount; 529 #else 530 DWORD dwBufferCount; 531 #endif 532 WSABUF Control; 533 #if (_WIN32_WINNT >= 0x0600) 534 ULONG dwFlags; 535 #else 536 DWORD dwFlags; 537 #endif 538 } WSAMSG, *PWSAMSG, *FAR LPWSAMSG; 539 540 #if (_WIN32_WINNT >= 0x0600) 541 #define _WSACMSGHDR cmsghdr 542 #endif 543 544 typedef struct _WSACMSGHDR { 545 SIZE_T cmsg_len; 546 INT cmsg_level; 547 INT cmsg_type; 548 } WSACMSGHDR, *PWSACMSGHDR, FAR *LPWSACMSGHDR; 549 550 #if (_WIN32_WINNT >= 0x0600) 551 typedef WSACMSGHDR CMSGHDR, *PCMSGHDR; 552 #endif 553 554 #define WSA_CMSGHDR_ALIGN(length) (((length) + TYPE_ALIGNMENT(WSACMSGHDR)-1) & \ 555 (~(TYPE_ALIGNMENT(WSACMSGHDR)-1))) 556 557 #define WSA_CMSGDATA_ALIGN(length) (((length) + MAX_NATURAL_ALIGNMENT-1) & \ 558 (~(MAX_NATURAL_ALIGNMENT-1))) 559 560 #if(_WIN32_WINNT >= 0x0600) 561 #define CMSGHDR_ALIGN WSA_CMSGHDR_ALIGN 562 #define CMSGDATA_ALIGN WSA_CMSGDATA_ALIGN 563 #endif 564 565 /* 566 * WSA_CMSG_FIRSTHDR 567 * 568 * Returns a pointer to the first ancillary data object, 569 * or a null pointer if there is no ancillary data in the 570 * control buffer of the WSAMSG structure. 571 * 572 * LPCMSGHDR 573 * WSA_CMSG_FIRSTHDR ( 574 * LPWSAMSG msg 575 * ); 576 */ 577 #define WSA_CMSG_FIRSTHDR(msg) (((msg)->Control.len >= sizeof(WSACMSGHDR)) \ 578 ? (LPWSACMSGHDR)(msg)->Control.buf \ 579 : (LPWSACMSGHDR)NULL) 580 581 #if(_WIN32_WINNT >= 0x0600) 582 #define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR 583 #endif 584 585 /* 586 * WSA_CMSG_NXTHDR 587 * 588 * Returns a pointer to the next ancillary data object, 589 * or a null if there are no more data objects. 590 * 591 * LPCMSGHDR 592 * WSA_CMSG_NEXTHDR ( 593 * LPWSAMSG msg, 594 * LPWSACMSGHDR cmsg 595 * ); 596 */ 597 #define WSA_CMSG_NXTHDR(msg, cmsg) \ 598 ( ((cmsg) == NULL) \ 599 ? WSA_CMSG_FIRSTHDR(msg) \ 600 : ( ( ((PUCHAR)(cmsg) + \ 601 WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len) + \ 602 sizeof(WSACMSGHDR) ) > \ 603 (PUCHAR)((msg)->Control.buf) + \ 604 (msg)->Control.len ) \ 605 ? (LPWSACMSGHDR)NULL \ 606 : (LPWSACMSGHDR)((PUCHAR)(cmsg) + \ 607 WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len)) ) ) 608 609 #if(_WIN32_WINNT >= 0x0600) 610 #define CMSG_NXTHDR WSA_CMSG_NXTHDR 611 #endif 612 613 /* 614 * WSA_CMSG_DATA 615 * 616 * Returns a pointer to the first byte of data (what is referred 617 * to as the cmsg_data member though it is not defined in 618 * the structure). 619 * 620 * Note that RFC 2292 defines this as CMSG_DATA, but that name 621 * is already used by wincrypt.h, and so Windows has used WSA_CMSG_DATA. 622 * 623 * PUCHAR 624 * WSA_CMSG_DATA ( 625 * LPWSACMSGHDR pcmsg 626 * ); 627 */ 628 #define WSA_CMSG_DATA(cmsg) ((PUCHAR)(cmsg) + WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR))) 629 630 /* 631 * WSA_CMSG_SPACE 632 * 633 * Returns total size of an ancillary data object given 634 * the amount of data. Used to allocate the correct amount 635 * of space. 636 * 637 * SIZE_T 638 * WSA_CMSG_SPACE ( 639 * SIZE_T length 640 * ); 641 */ 642 #define WSA_CMSG_SPACE(length) (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR) + WSA_CMSGHDR_ALIGN(length))) 643 644 #if(_WIN32_WINNT >= 0x0600) 645 #define CMSG_SPACE WSA_CMSG_SPACE 646 #endif 647 648 /* 649 * WSA_CMSG_LEN 650 * 651 * Returns the value to store in cmsg_len given the amount of data. 652 * 653 * SIZE_T 654 * WSA_CMSG_LEN ( 655 * SIZE_T length 656 * ); 657 */ 658 #define WSA_CMSG_LEN(length) (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) + length) 659 660 #if(_WIN32_WINNT >= 0x0600) 661 #define CMSG_LEN WSA_CMSG_LEN 662 #endif 663 664 typedef struct addrinfo { 665 int ai_flags; 666 int ai_family; 667 int ai_socktype; 668 int ai_protocol; 669 size_t ai_addrlen; 670 char *ai_canonname; 671 struct sockaddr *ai_addr; 672 struct addrinfo *ai_next; 673 } ADDRINFOA, *PADDRINFOA; 674 675 typedef struct addrinfoW { 676 int ai_flags; 677 int ai_family; 678 int ai_socktype; 679 int ai_protocol; 680 size_t ai_addrlen; 681 PWSTR ai_canonname; 682 struct sockaddr *ai_addr; 683 struct addrinfoW *ai_next; 684 } ADDRINFOW, *PADDRINFOW; 685 686 #if (_WIN32_WINNT >= 0x0600) 687 688 typedef struct addrinfoexA { 689 int ai_flags; 690 int ai_family; 691 int ai_socktype; 692 int ai_protocol; 693 size_t ai_addrlen; 694 char *ai_canonname; 695 struct sockaddr *ai_addr; 696 void *ai_blob; 697 size_t ai_bloblen; 698 LPGUID ai_provider; 699 struct addrinfoexA *ai_next; 700 } ADDRINFOEXA, *PADDRINFOEXA, *LPADDRINFOEXA; 701 702 typedef struct addrinfoexW { 703 int ai_flags; 704 int ai_family; 705 int ai_socktype; 706 int ai_protocol; 707 size_t ai_addrlen; 708 PWSTR ai_canonname; 709 struct sockaddr *ai_addr; 710 void *ai_blob; 711 size_t ai_bloblen; 712 LPGUID ai_provider; 713 struct addrinfoexW *ai_next; 714 } ADDRINFOEXW, *PADDRINFOEXW, *LPADDRINFOEXW; 715 716 #endif /* (_WIN32_WINNT >= 0x0600) */ 717 718 #ifdef __cplusplus 719 } 720 #endif 721