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

模拟服务器

开发平台:

C/C++

  1. /*++
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3. Module Name:
  4.     mswsock.h
  5. Abstract:
  6.     This module contains the Microsoft-specific extensions to the Windows
  7.     Sockets API.
  8. Revision History:
  9. --*/
  10. #ifndef _MSWSOCK_
  11. #define _MSWSOCK_
  12. #if _MSC_VER > 1000
  13. #pragma once
  14. #endif
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18. /*
  19.  * Options for connect and disconnect data and options.  Used only by
  20.  * non-TCP/IP transports such as DECNet, OSI TP4, etc.
  21.  */
  22. #define SO_CONNDATA                 0x7000
  23. #define SO_CONNOPT                  0x7001
  24. #define SO_DISCDATA                 0x7002
  25. #define SO_DISCOPT                  0x7003
  26. #define SO_CONNDATALEN              0x7004
  27. #define SO_CONNOPTLEN               0x7005
  28. #define SO_DISCDATALEN              0x7006
  29. #define SO_DISCOPTLEN               0x7007
  30. /*
  31.  * Option for opening sockets for synchronous access.
  32.  */
  33. #define SO_OPENTYPE                 0x7008
  34. #define SO_SYNCHRONOUS_ALERT        0x10
  35. #define SO_SYNCHRONOUS_NONALERT     0x20
  36. /*
  37.  * Other NT-specific options.
  38.  */
  39. #define SO_MAXDG                    0x7009
  40. #define SO_MAXPATHDG                0x700A
  41. #define SO_UPDATE_ACCEPT_CONTEXT    0x700B
  42. #define SO_CONNECT_TIME             0x700C
  43. #define SO_UPDATE_CONNECT_CONTEXT   0x7010
  44. /*
  45.  * TCP options.
  46.  */
  47. #define TCP_BSDURGENT               0x7000
  48. /*
  49.  * MS Transport Provider IOCTL to control
  50.  * reporting PORT_UNREACHABLE messages 
  51.  * on UDP sockets via recv/WSARecv/etc.
  52.  * Path TRUE in input buffer to enable (default if supported),
  53.  * FALSE to disable.
  54.  */
  55. #define SIO_UDP_CONNRESET           _WSAIOW(IOC_VENDOR,12)
  56. /*
  57.  * Microsoft extended APIs.
  58.  */
  59. int
  60. PASCAL FAR
  61. WSARecvEx (
  62.     SOCKET s,
  63.     char FAR *buf,
  64.     int len,
  65.     int FAR *flags
  66.     );
  67. typedef struct _TRANSMIT_FILE_BUFFERS {
  68.     LPVOID Head;
  69.     DWORD HeadLength;
  70.     LPVOID Tail;
  71.     DWORD TailLength;
  72. } TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, FAR *LPTRANSMIT_FILE_BUFFERS;
  73. #define TF_DISCONNECT       0x01
  74. #define TF_REUSE_SOCKET     0x02
  75. #define TF_WRITE_BEHIND     0x04
  76. #define TF_USE_DEFAULT_WORKER 0x00
  77. #define TF_USE_SYSTEM_THREAD  0x10
  78. #define TF_USE_KERNEL_APC     0x20
  79. BOOL
  80. PASCAL FAR
  81. TransmitFile (
  82.     IN SOCKET hSocket,
  83.     IN HANDLE hFile,
  84.     IN DWORD nNumberOfBytesToWrite,
  85.     IN DWORD nNumberOfBytesPerSend,
  86.     IN LPOVERLAPPED lpOverlapped,
  87.     IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
  88.     IN DWORD dwReserved
  89.     );
  90. BOOL
  91. PASCAL FAR
  92. AcceptEx (
  93.     IN SOCKET sListenSocket,
  94.     IN SOCKET sAcceptSocket,
  95.     IN PVOID lpOutputBuffer,
  96.     IN DWORD dwReceiveDataLength,
  97.     IN DWORD dwLocalAddressLength,
  98.     IN DWORD dwRemoteAddressLength,
  99.     OUT LPDWORD lpdwBytesReceived,
  100.     IN LPOVERLAPPED lpOverlapped
  101.     );
  102. VOID
  103. PASCAL FAR
  104. GetAcceptExSockaddrs (
  105.     IN PVOID lpOutputBuffer,
  106.     IN DWORD dwReceiveDataLength,
  107.     IN DWORD dwLocalAddressLength,
  108.     IN DWORD dwRemoteAddressLength,
  109.     OUT struct sockaddr **LocalSockaddr,
  110.     OUT LPINT LocalSockaddrLength,
  111.     OUT struct sockaddr **RemoteSockaddr,
  112.     OUT LPINT RemoteSockaddrLength
  113.     );
  114. /*
  115.  * "QueryInterface" versions of the above APIs.
  116.  */
  117. typedef
  118. BOOL
  119. (PASCAL FAR * LPFN_TRANSMITFILE)(
  120.     IN SOCKET hSocket,
  121.     IN HANDLE hFile,
  122.     IN DWORD nNumberOfBytesToWrite,
  123.     IN DWORD nNumberOfBytesPerSend,
  124.     IN LPOVERLAPPED lpOverlapped,
  125.     IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
  126.     IN DWORD dwReserved
  127.     );
  128. #define WSAID_TRANSMITFILE 
  129.         {0xb5367df0,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}
  130. typedef
  131. BOOL
  132. (PASCAL FAR * LPFN_ACCEPTEX)(
  133.     IN SOCKET sListenSocket,
  134.     IN SOCKET sAcceptSocket,
  135.     IN PVOID lpOutputBuffer,
  136.     IN DWORD dwReceiveDataLength,
  137.     IN DWORD dwLocalAddressLength,
  138.     IN DWORD dwRemoteAddressLength,
  139.     OUT LPDWORD lpdwBytesReceived,
  140.     IN LPOVERLAPPED lpOverlapped
  141.     );
  142. #define WSAID_ACCEPTEX 
  143.         {0xb5367df1,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}
  144. typedef
  145. VOID
  146. (PASCAL FAR * LPFN_GETACCEPTEXSOCKADDRS)(
  147.     IN PVOID lpOutputBuffer,
  148.     IN DWORD dwReceiveDataLength,
  149.     IN DWORD dwLocalAddressLength,
  150.     IN DWORD dwRemoteAddressLength,
  151.     OUT struct sockaddr **LocalSockaddr,
  152.     OUT LPINT LocalSockaddrLength,
  153.     OUT struct sockaddr **RemoteSockaddr,
  154.     OUT LPINT RemoteSockaddrLength
  155.     );
  156. #define WSAID_GETACCEPTEXSOCKADDRS 
  157.         {0xb5367df2,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}
  158. #if _MSC_VER >= 1200
  159. #pragma warning(push)
  160. #endif
  161. #pragma warning(disable:4201) /* Nonstandard extension, nameless struct/union */
  162. typedef struct _TRANSMIT_PACKETS_ELEMENT { 
  163.     ULONG dwElFlags; 
  164. #define TP_ELEMENT_MEMORY   1
  165. #define TP_ELEMENT_FILE     2
  166. #define TP_ELEMENT_EOP      4
  167.     ULONG cLength; 
  168.     union {
  169.         struct {
  170.             LARGE_INTEGER nFileOffset;
  171.             HANDLE        hFile;
  172.         };
  173.         PVOID             pBuffer;
  174.     };
  175. } TRANSMIT_PACKETS_ELEMENT, *PTRANSMIT_PACKETS_ELEMENT, FAR *LPTRANSMIT_PACKETS_ELEMENT;
  176. #if _MSC_VER >= 1200
  177. #pragma warning(pop)
  178. #else
  179. #pragma warning(default:4201)
  180. #endif
  181. #define TP_DISCONNECT           TF_DISCONNECT
  182. #define TP_REUSE_SOCKET         TF_REUSE_SOCKET
  183. #define TP_USE_DEFAULT_WORKER   TF_USE_DEFAULT_WORKER
  184. #define TP_USE_SYSTEM_THREAD    TF_USE_SYSTEM_THREAD
  185. #define TP_USE_KERNEL_APC       TF_USE_KERNEL_APC
  186. typedef
  187. BOOL
  188. (PASCAL FAR * LPFN_TRANSMITPACKETS) (
  189.     SOCKET hSocket,                             
  190.     LPTRANSMIT_PACKETS_ELEMENT lpPacketArray,                               
  191.     DWORD nElementCount,                
  192.     DWORD nSendSize,                
  193.     LPOVERLAPPED lpOverlapped,                  
  194.     DWORD dwFlags                               
  195.     );
  196. #define WSAID_TRANSMITPACKETS 
  197.     {0xd9689da0,0x1f90,0x11d3,{0x99,0x71,0x00,0xc0,0x4f,0x68,0xc8,0x76}}
  198. typedef
  199. BOOL
  200. (PASCAL FAR * LPFN_CONNECTEX) (
  201.     IN SOCKET s,
  202.     IN const struct sockaddr FAR *name,
  203.     IN int namelen,
  204.     IN PVOID lpSendBuffer OPTIONAL,
  205.     IN DWORD dwSendDataLength,
  206.     OUT LPDWORD lpdwBytesSent,
  207.     IN LPOVERLAPPED lpOverlapped
  208.     );
  209. #define WSAID_CONNECTEX 
  210.     {0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}}
  211. typedef
  212. BOOL
  213. (PASCAL FAR * LPFN_DISCONNECTEX) (
  214.     IN SOCKET s,
  215.     IN LPOVERLAPPED lpOverlapped,
  216.     IN DWORD  dwFlags,
  217.     IN DWORD  dwReserved
  218.     );
  219. #define WSAID_DISCONNECTEX 
  220.     {0x7fda2e11,0x8630,0x436f,{0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}}
  221. #define DE_REUSE_SOCKET TF_REUSE_SOCKET
  222.   
  223. /*
  224.  * Network-location awareness -- Name registration values for use
  225.  * with WSASetService and other structures.
  226.  */
  227. // {6642243A-3BA8-4aa6-BAA5-2E0BD71FDD83}
  228. #define NLA_NAMESPACE_GUID 
  229.     {0x6642243a,0x3ba8,0x4aa6,{0xba,0xa5,0x2e,0xb,0xd7,0x1f,0xdd,0x83}}
  230. // {6642243A-3BA8-4aa6-BAA5-2E0BD71FDD83}
  231. #define NLA_SERVICE_CLASS_GUID 
  232.     {0x37e515,0xb5c9,0x4a43,{0xba,0xda,0x8b,0x48,0xa8,0x7a,0xd2,0x39}}
  233. #define NLA_ALLUSERS_NETWORK   0x00000001
  234. #define NLA_FRIENDLY_NAME      0x00000002
  235. typedef enum _NLA_BLOB_DATA_TYPE {
  236.     NLA_RAW_DATA          = 0,
  237.     NLA_INTERFACE         = 1,
  238.     NLA_802_1X_LOCATION   = 2,
  239.     NLA_CONNECTIVITY      = 3,
  240.     NLA_ICS               = 4,
  241. } NLA_BLOB_DATA_TYPE, *PNLA_BLOB_DATA_TYPE;
  242. typedef enum _NLA_CONNECTIVITY_TYPE {
  243.     NLA_NETWORK_AD_HOC    = 0,
  244.     NLA_NETWORK_MANAGED   = 1,
  245.     NLA_NETWORK_UNMANAGED = 2,
  246.     NLA_NETWORK_UNKNOWN   = 3,
  247. } NLA_CONNECTIVITY_TYPE, *PNLA_CONNECTIVITY_TYPE;
  248. typedef enum _NLA_INTERNET {
  249.     NLA_INTERNET_UNKNOWN  = 0,
  250.     NLA_INTERNET_NO       = 1,
  251.     NLA_INTERNET_YES      = 2,
  252. } NLA_INTERNET, *PNLA_INTERNET;
  253. typedef struct _NLA_BLOB {
  254.     struct {
  255.         NLA_BLOB_DATA_TYPE type;
  256.         DWORD dwSize;
  257.         DWORD nextOffset;
  258.     } header;
  259.     union {
  260.         // header.type -> NLA_RAW_DATA
  261.         CHAR rawData[1];
  262.         // header.type -> NLA_INTERFACE
  263.         struct {
  264.             DWORD dwType;
  265.             DWORD dwSpeed;
  266.             CHAR adapterName[1];
  267.         } interfaceData;
  268.         // header.type -> NLA_802_1X_LOCATION
  269.         struct {
  270.             CHAR information[1];
  271.         } locationData;
  272.         // header.type -> NLA_CONNECTIVITY
  273.         struct {
  274.             NLA_CONNECTIVITY_TYPE type;
  275.             NLA_INTERNET internet;
  276.         } connectivity;
  277.         // header.type -> NLA_ICS
  278.         struct {
  279.             struct {
  280.                 DWORD speed;
  281.                 DWORD type;
  282.                 DWORD state;
  283.                 WCHAR machineName[256];
  284.                 WCHAR sharedAdapterName[256];
  285.             } remote;
  286.         } ICS;
  287.     } data;
  288. } NLA_BLOB, *PNLA_BLOB, * FAR LPNLA_BLOB;
  289. typedef struct _WSAMSG {
  290.     LPSOCKADDR       name;              /* Remote address */
  291.     INT              namelen;           /* Remote address length */
  292.     LPWSABUF         lpBuffers;         /* Data buffer array */
  293.     DWORD            dwBufferCount;     /* Number of elements in the array */
  294.     WSABUF           Control;           /* Control buffer */
  295.     DWORD            dwFlags;           /* Flags */
  296. } WSAMSG, *PWSAMSG, * FAR LPWSAMSG;
  297. /*
  298.  * Layout of ancillary data objects in the control buffer
  299.  */
  300. typedef struct _WSACMSGHDR {
  301.     SIZE_T      cmsg_len;
  302.     INT         cmsg_level;
  303.     INT         cmsg_type;
  304.     /* followed by UCHAR cmsg_data[] */
  305. } WSACMSGHDR, *PWSACMSGHDR, FAR *LPWSACMSGHDR;
  306. /*
  307.  * Alignment macros for header and data members of
  308.  * the control buffer.
  309.  */
  310. #define WSA_CMSGHDR_ALIGN(length)                           
  311.             ( ((length) + TYPE_ALIGNMENT(WSACMSGHDR)-1) &   
  312.                 (~(TYPE_ALIGNMENT(WSACMSGHDR)-1)) )         
  313. #define WSA_CMSGDATA_ALIGN(length)                          
  314.             ( ((length) + MAX_NATURAL_ALIGNMENT-1) &        
  315.                 (~(MAX_NATURAL_ALIGNMENT-1)) )
  316. /*
  317.  *  WSA_CMSG_FIRSTHDR
  318.  *
  319.  *  Returns a pointer to the first ancillary data object, 
  320.  *  or a null pointer if there is no ancillary data in the 
  321.  *  control buffer of the WSAMSG structure.
  322.  *
  323.  *  LPCMSGHDR 
  324.  *  WSA_CMSG_FIRSTHDR (
  325.  *      LPWSAMSG    msg
  326.  *      );
  327.  */
  328. #define WSA_CMSG_FIRSTHDR(msg) 
  329.     ( ((msg)->Control.len >= sizeof(WSACMSGHDR))            
  330.         ? (LPWSACMSGHDR)(msg)->Control.buf                  
  331.         : (LPWSACMSGHDR)NULL )
  332. /* 
  333.  *  WSA_CMSG_NXTHDR
  334.  *
  335.  *  Returns a pointer to the next ancillary data object,
  336.  *  or a null if there are no more data objects.
  337.  *
  338.  *  LPCMSGHDR 
  339.  *  WSA_CMSG_NEXTHDR (
  340.  *      LPWSAMSG        msg,
  341.  *      LPWSACMSGHDR    cmsg
  342.  *      );
  343.  */
  344. #define WSA_CMSG_NXTHDR(msg, cmsg)                          
  345.     ( ((cmsg) == NULL)                                      
  346.         ? WSA_CMSG_FIRSTHDR(msg)                            
  347.         : ( ( ((u_char *)(cmsg) +                           
  348.                     WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len) +   
  349.                     sizeof(WSACMSGHDR) ) >                  
  350.                 (u_char *)((msg)->Control.buf) +            
  351.                     (msg)->Control.len )                    
  352.             ? (LPWSACMSGHDR)NULL                            
  353.             : (LPWSACMSGHDR)((u_char *)(cmsg) +             
  354.                 WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len)) ) )
  355. /* 
  356.  *  WSA_CMSG_DATA
  357.  *
  358.  *  Returns a pointer to the first byte of data (what is referred 
  359.  *  to as the cmsg_data member though it is not defined in 
  360.  *  the structure).
  361.  *
  362.  *  u_char *
  363.  *  WSA_CMSG_DATA (
  364.  *      LPWSACMSGHDR   pcmsg
  365.  *      );
  366.  */
  367. #define WSA_CMSG_DATA(cmsg)             
  368.             ( (u_char *)(cmsg) + WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) )
  369. /*
  370.  *  WSA_CMSG_SPACE
  371.  *
  372.  *  Returns total size of an ancillary data object given 
  373.  *  the amount of data. Used to allocate the correct amount 
  374.  *  of space.
  375.  *
  376.  *  SIZE_T
  377.  *  WSA_CMSG_SPACE (
  378.  *      SIZE_T length
  379.  *      );
  380.  */
  381. #define WSA_CMSG_SPACE(length)  
  382.         (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR) + WSA_CMSGHDR_ALIGN(length)))
  383. /*
  384.  *  WSA_CMSG_LEN
  385.  *
  386.  *  Returns the value to store in cmsg_len given the amount of data.
  387.  *
  388.  *  SIZE_T
  389.  *  WSA_CMSG_LEN (
  390.  *      SIZE_T length
  391.  *  );
  392.  */
  393. #define WSA_CMSG_LEN(length)    
  394.          (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) + length)
  395. /*
  396.  * Definition for flags member of the WSAMSG structure
  397.  * This is in addition to other MSG_xxx flags defined
  398.  * for recv/recvfrom/send/sendto.
  399.  */
  400. #define MSG_TRUNC       0x0100
  401. #define MSG_CTRUNC      0x0200
  402. #define MSG_BCAST       0x0400
  403. #define MSG_MCAST       0x0800
  404. typedef
  405. INT
  406. (PASCAL FAR * LPFN_WSARECVMSG) (
  407.     IN SOCKET s, 
  408.     IN OUT LPWSAMSG lpMsg, 
  409.     OUT LPDWORD lpdwNumberOfBytesRecvd, 
  410.     IN LPWSAOVERLAPPED lpOverlapped, 
  411.     IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
  412.     );
  413. #define WSAID_WSARECVMSG 
  414.     {0xf689d7c8,0x6f1f,0x436b,{0x8a,0x53,0xe5,0x4f,0xe3,0x51,0xc3,0x22}}
  415. #ifdef __cplusplus
  416. }
  417. #endif
  418. #endif  /* _MSWSOCK_ */