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

模拟服务器

开发平台:

C/C++

  1. /* WINSOCK.H--definitions to be used with the WINSOCK.DLL
  2.  * Copyright (c) Microsoft Corporation. All rights reserved.
  3.  *
  4.  * This header file corresponds to version 1.1 of the Windows Sockets specification.
  5.  *
  6.  * This file includes parts which are Copyright (c) 1982-1986 Regents
  7.  * of the University of California.  All rights reserved.  The
  8.  * Berkeley Software License Agreement specifies the terms and
  9.  * conditions for redistribution.
  10.  *
  11.  */
  12. #ifndef _WINSOCKAPI_
  13. #define _WINSOCKAPI_
  14. #if _MSC_VER > 1000
  15. #pragma once
  16. #endif
  17. /*
  18.  * Pull in WINDOWS.H if necessary
  19.  */
  20. #ifndef _INC_WINDOWS
  21. #include <windows.h>
  22. #endif /* _INC_WINDOWS */
  23. /*
  24.  * Basic system type definitions, taken from the BSD file sys/types.h.
  25.  */
  26. typedef unsigned char   u_char;
  27. typedef unsigned short  u_short;
  28. typedef unsigned int    u_int;
  29. typedef unsigned long   u_long;
  30. /*
  31.  * The new type to be used in all
  32.  * instances which refer to sockets.
  33.  */
  34. typedef UINT_PTR        SOCKET;
  35. /*
  36.  * Select uses arrays of SOCKETs.  These macros manipulate such
  37.  * arrays.  FD_SETSIZE may be defined by the user before including
  38.  * this file, but the default here should be >= 64.
  39.  *
  40.  * CAVEAT IMPLEMENTOR and USER: THESE MACROS AND TYPES MUST BE
  41.  * INCLUDED IN WINSOCK.H EXACTLY AS SHOWN HERE.
  42.  */
  43. #ifndef FD_SETSIZE
  44. #define FD_SETSIZE      64
  45. #endif /* FD_SETSIZE */
  46. typedef struct fd_set {
  47.         u_int   fd_count;               /* how many are SET? */
  48.         SOCKET  fd_array[FD_SETSIZE];   /* an array of SOCKETs */
  49. } fd_set;
  50. #ifdef __cplusplus
  51. extern "C" {
  52. #endif
  53. extern int PASCAL FAR __WSAFDIsSet(SOCKET, fd_set FAR *);
  54. #ifdef __cplusplus
  55. }
  56. #endif
  57. #define FD_CLR(fd, set) do { 
  58.     u_int __i; 
  59.     for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count ; __i++) { 
  60.         if (((fd_set FAR *)(set))->fd_array[__i] == fd) { 
  61.             while (__i < ((fd_set FAR *)(set))->fd_count-1) { 
  62.                 ((fd_set FAR *)(set))->fd_array[__i] = 
  63.                     ((fd_set FAR *)(set))->fd_array[__i+1]; 
  64.                 __i++; 
  65.             } 
  66.             ((fd_set FAR *)(set))->fd_count--; 
  67.             break; 
  68.         } 
  69.     } 
  70. } while(0)
  71. #define FD_SET(fd, set) do { 
  72.     if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) 
  73.         ((fd_set FAR *)(set))->fd_array[((fd_set FAR *)(set))->fd_count++]=(fd);
  74. } while(0)
  75. #define FD_ZERO(set) (((fd_set FAR *)(set))->fd_count=0)
  76. #define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set FAR *)(set))
  77. /*
  78.  * Structure used in select() call, taken from the BSD file sys/time.h.
  79.  */
  80. struct timeval {
  81.         long    tv_sec;         /* seconds */
  82.         long    tv_usec;        /* and microseconds */
  83. };
  84. /*
  85.  * Operations on timevals.
  86.  *
  87.  * NB: timercmp does not work for >= or <=.
  88.  */
  89. #define timerisset(tvp)         ((tvp)->tv_sec || (tvp)->tv_usec)
  90. #define timercmp(tvp, uvp, cmp) 
  91.         ((tvp)->tv_sec cmp (uvp)->tv_sec || 
  92.          (tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec cmp (uvp)->tv_usec)
  93. #define timerclear(tvp)         (tvp)->tv_sec = (tvp)->tv_usec = 0
  94. /*
  95.  * Commands for ioctlsocket(),  taken from the BSD file fcntl.h.
  96.  *
  97.  *
  98.  * Ioctl's have the command encoded in the lower word,
  99.  * and the size of any in or out parameters in the upper
  100.  * word.  The high 2 bits of the upper word are used
  101.  * to encode the in/out status of the parameter; for now
  102.  * we restrict parameters to at most 128 bytes.
  103.  */
  104. #define IOCPARM_MASK    0x7f            /* parameters must be < 128 bytes */
  105. #define IOC_VOID        0x20000000      /* no parameters */
  106. #define IOC_OUT         0x40000000      /* copy out parameters */
  107. #define IOC_IN          0x80000000      /* copy in parameters */
  108. #define IOC_INOUT       (IOC_IN|IOC_OUT)
  109.                                         /* 0x20000000 distinguishes new &
  110.                                            old ioctl's */
  111. #define _IO(x,y)        (IOC_VOID|((x)<<8)|(y))
  112. #define _IOR(x,y,t)     (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
  113. #define _IOW(x,y,t)     (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
  114. #define FIONREAD    _IOR('f', 127, u_long) /* get # bytes to read */
  115. #define FIONBIO     _IOW('f', 126, u_long) /* set/clear non-blocking i/o */
  116. #define FIOASYNC    _IOW('f', 125, u_long) /* set/clear async i/o */
  117. /* Socket I/O Controls */
  118. #define SIOCSHIWAT  _IOW('s',  0, u_long)  /* set high watermark */
  119. #define SIOCGHIWAT  _IOR('s',  1, u_long)  /* get high watermark */
  120. #define SIOCSLOWAT  _IOW('s',  2, u_long)  /* set low watermark */
  121. #define SIOCGLOWAT  _IOR('s',  3, u_long)  /* get low watermark */
  122. #define SIOCATMARK  _IOR('s',  7, u_long)  /* at oob mark? */
  123. /*
  124.  * Structures returned by network data base library, taken from the
  125.  * BSD file netdb.h.  All addresses are supplied in host order, and
  126.  * returned in network order (suitable for use in system calls).
  127.  */
  128. struct  hostent {
  129.         char    FAR * h_name;           /* official name of host */
  130.         char    FAR * FAR * h_aliases;  /* alias list */
  131.         short   h_addrtype;             /* host address type */
  132.         short   h_length;               /* length of address */
  133.         char    FAR * FAR * h_addr_list; /* list of addresses */
  134. #define h_addr  h_addr_list[0]          /* address, for backward compat */
  135. };
  136. /*
  137.  * It is assumed here that a network number
  138.  * fits in 32 bits.
  139.  */
  140. struct  netent {
  141.         char    FAR * n_name;           /* official name of net */
  142.         char    FAR * FAR * n_aliases;  /* alias list */
  143.         short   n_addrtype;             /* net address type */
  144.         u_long  n_net;                  /* network # */
  145. };
  146. struct  servent {
  147.         char    FAR * s_name;           /* official service name */
  148.         char    FAR * FAR * s_aliases;  /* alias list */
  149. #ifdef _WIN64
  150.         char    FAR * s_proto;          /* protocol to use */
  151.         short   s_port;                 /* port # */
  152. #else
  153.         short   s_port;                 /* port # */
  154.         char    FAR * s_proto;          /* protocol to use */
  155. #endif
  156. };
  157. struct  protoent {
  158.         char    FAR * p_name;           /* official protocol name */
  159.         char    FAR * FAR * p_aliases;  /* alias list */
  160.         short   p_proto;                /* protocol # */
  161. };
  162. /*
  163.  * Constants and structures defined by the internet system,
  164.  * Per RFC 790, September 1981, taken from the BSD file netinet/in.h.
  165.  */
  166. /*
  167.  * Protocols
  168.  */
  169. #define IPPROTO_IP              0               /* dummy for IP */
  170. #define IPPROTO_ICMP            1               /* control message protocol */
  171. #define IPPROTO_IGMP            2               /* group management protocol */
  172. #define IPPROTO_GGP             3               /* gateway^2 (deprecated) */
  173. #define IPPROTO_TCP             6               /* tcp */
  174. #define IPPROTO_PUP             12              /* pup */
  175. #define IPPROTO_UDP             17              /* user datagram protocol */
  176. #define IPPROTO_IDP             22              /* xns idp */
  177. #define IPPROTO_ND              77              /* UNOFFICIAL net disk proto */
  178. #define IPPROTO_RAW             255             /* raw IP packet */
  179. #define IPPROTO_MAX             256
  180. /*
  181.  * Port/socket numbers: network standard functions
  182.  */
  183. #define IPPORT_ECHO             7
  184. #define IPPORT_DISCARD          9
  185. #define IPPORT_SYSTAT           11
  186. #define IPPORT_DAYTIME          13
  187. #define IPPORT_NETSTAT          15
  188. #define IPPORT_FTP              21
  189. #define IPPORT_TELNET           23
  190. #define IPPORT_SMTP             25
  191. #define IPPORT_TIMESERVER       37
  192. #define IPPORT_NAMESERVER       42
  193. #define IPPORT_WHOIS            43
  194. #define IPPORT_MTP              57
  195. /*
  196.  * Port/socket numbers: host specific functions
  197.  */
  198. #define IPPORT_TFTP             69
  199. #define IPPORT_RJE              77
  200. #define IPPORT_FINGER           79
  201. #define IPPORT_TTYLINK          87
  202. #define IPPORT_SUPDUP           95
  203. /*
  204.  * UNIX TCP sockets
  205.  */
  206. #define IPPORT_EXECSERVER       512
  207. #define IPPORT_LOGINSERVER      513
  208. #define IPPORT_CMDSERVER        514
  209. #define IPPORT_EFSSERVER        520
  210. /*
  211.  * UNIX UDP sockets
  212.  */
  213. #define IPPORT_BIFFUDP          512
  214. #define IPPORT_WHOSERVER        513
  215. #define IPPORT_ROUTESERVER      520
  216.                                         /* 520+1 also used */
  217. /*
  218.  * Ports < IPPORT_RESERVED are reserved for
  219.  * privileged processes (e.g. root).
  220.  */
  221. #define IPPORT_RESERVED         1024
  222. /*
  223.  * Link numbers
  224.  */
  225. #define IMPLINK_IP              155
  226. #define IMPLINK_LOWEXPER        156
  227. #define IMPLINK_HIGHEXPER       158
  228. /*
  229.  * Internet address (old style... should be updated)
  230.  */
  231. struct in_addr {
  232.         union {
  233.                 struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
  234.                 struct { u_short s_w1,s_w2; } S_un_w;
  235.                 u_long S_addr;
  236.         } S_un;
  237. #define s_addr  S_un.S_addr
  238.                                 /* can be used for most tcp & ip code */
  239. #define s_host  S_un.S_un_b.s_b2
  240.                                 /* host on imp */
  241. #define s_net   S_un.S_un_b.s_b1
  242.                                 /* network */
  243. #define s_imp   S_un.S_un_w.s_w2
  244.                                 /* imp */
  245. #define s_impno S_un.S_un_b.s_b4
  246.                                 /* imp # */
  247. #define s_lh    S_un.S_un_b.s_b3
  248.                                 /* logical host */
  249. };
  250. /*
  251.  * Definitions of bits in internet address integers.
  252.  * On subnets, the decomposition of addresses to host and net parts
  253.  * is done according to subnet mask, not the masks here.
  254.  */
  255. #define IN_CLASSA(i)            (((long)(i) & 0x80000000) == 0)
  256. #define IN_CLASSA_NET           0xff000000
  257. #define IN_CLASSA_NSHIFT        24
  258. #define IN_CLASSA_HOST          0x00ffffff
  259. #define IN_CLASSA_MAX           128
  260. #define IN_CLASSB(i)            (((long)(i) & 0xc0000000) == 0x80000000)
  261. #define IN_CLASSB_NET           0xffff0000
  262. #define IN_CLASSB_NSHIFT        16
  263. #define IN_CLASSB_HOST          0x0000ffff
  264. #define IN_CLASSB_MAX           65536
  265. #define IN_CLASSC(i)            (((long)(i) & 0xe0000000) == 0xc0000000)
  266. #define IN_CLASSC_NET           0xffffff00
  267. #define IN_CLASSC_NSHIFT        8
  268. #define IN_CLASSC_HOST          0x000000ff
  269. #define INADDR_ANY              (u_long)0x00000000
  270. #define INADDR_LOOPBACK         0x7f000001
  271. #define INADDR_BROADCAST        (u_long)0xffffffff
  272. #define INADDR_NONE             0xffffffff
  273. /*
  274.  * Socket address, internet style.
  275.  */
  276. struct sockaddr_in {
  277.         short   sin_family;
  278.         u_short sin_port;
  279.         struct  in_addr sin_addr;
  280.         char    sin_zero[8];
  281. };
  282. #define WSADESCRIPTION_LEN      256
  283. #define WSASYS_STATUS_LEN       128
  284. typedef struct WSAData {
  285.         WORD                    wVersion;
  286.         WORD                    wHighVersion;
  287. #ifdef _WIN64
  288.         unsigned short          iMaxSockets;
  289.         unsigned short          iMaxUdpDg;
  290.         char FAR *              lpVendorInfo;
  291.         char                    szDescription[WSADESCRIPTION_LEN+1];
  292.         char                    szSystemStatus[WSASYS_STATUS_LEN+1];
  293. #else
  294.         char                    szDescription[WSADESCRIPTION_LEN+1];
  295.         char                    szSystemStatus[WSASYS_STATUS_LEN+1];
  296.         unsigned short          iMaxSockets;
  297.         unsigned short          iMaxUdpDg;
  298.         char FAR *              lpVendorInfo;
  299. #endif
  300. } WSADATA;
  301. typedef WSADATA FAR *LPWSADATA;
  302. /*
  303.  * Options for use with [gs]etsockopt at the IP level.
  304.  */
  305. #define IP_OPTIONS          1           /* set/get IP per-packet options    */
  306. #define IP_MULTICAST_IF     2           /* set/get IP multicast interface   */
  307. #define IP_MULTICAST_TTL    3           /* set/get IP multicast timetolive  */
  308. #define IP_MULTICAST_LOOP   4           /* set/get IP multicast loopback    */
  309. #define IP_ADD_MEMBERSHIP   5           /* add  an IP group membership      */
  310. #define IP_DROP_MEMBERSHIP  6           /* drop an IP group membership      */
  311. #define IP_TTL              7           /* set/get IP Time To Live          */
  312. #define IP_TOS              8           /* set/get IP Type Of Service       */
  313. #define IP_DONTFRAGMENT     9           /* set/get IP Don't Fragment flag   */
  314. #define IP_DEFAULT_MULTICAST_TTL   1    /* normally limit m'casts to 1 hop  */
  315. #define IP_DEFAULT_MULTICAST_LOOP  1    /* normally hear sends if a member  */
  316. #define IP_MAX_MEMBERSHIPS         20   /* per socket; must fit in one mbuf */
  317. /*
  318.  * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP.
  319.  */
  320. struct ip_mreq {
  321.         struct in_addr  imr_multiaddr;  /* IP multicast address of group */
  322.         struct in_addr  imr_interface;  /* local IP address of interface */
  323. };
  324. /*
  325.  * Definitions related to sockets: types, address families, options,
  326.  * taken from the BSD file sys/socket.h.
  327.  */
  328. /*
  329.  * This is used instead of -1, since the
  330.  * SOCKET type is unsigned.
  331.  */
  332. #define INVALID_SOCKET  (SOCKET)(~0)
  333. #define SOCKET_ERROR            (-1)
  334. /*
  335.  * Types
  336.  */
  337. #define SOCK_STREAM     1               /* stream socket */
  338. #define SOCK_DGRAM      2               /* datagram socket */
  339. #define SOCK_RAW        3               /* raw-protocol interface */
  340. #define SOCK_RDM        4               /* reliably-delivered message */
  341. #define SOCK_SEQPACKET  5               /* sequenced packet stream */
  342. /*
  343.  * Option flags per-socket.
  344.  */
  345. #define SO_DEBUG        0x0001          /* turn on debugging info recording */
  346. #define SO_ACCEPTCONN   0x0002          /* socket has had listen() */
  347. #define SO_REUSEADDR    0x0004          /* allow local address reuse */
  348. #define SO_KEEPALIVE    0x0008          /* keep connections alive */
  349. #define SO_DONTROUTE    0x0010          /* just use interface addresses */
  350. #define SO_BROADCAST    0x0020          /* permit sending of broadcast msgs */
  351. #define SO_USELOOPBACK  0x0040          /* bypass hardware when possible */
  352. #define SO_LINGER       0x0080          /* linger on close if data present */
  353. #define SO_OOBINLINE    0x0100          /* leave received OOB data in line */
  354. #define SO_DONTLINGER   (u_int)(~SO_LINGER)
  355. /*
  356.  * Additional options.
  357.  */
  358. #define SO_SNDBUF       0x1001          /* send buffer size */
  359. #define SO_RCVBUF       0x1002          /* receive buffer size */
  360. #define SO_SNDLOWAT     0x1003          /* send low-water mark */
  361. #define SO_RCVLOWAT     0x1004          /* receive low-water mark */
  362. #define SO_SNDTIMEO     0x1005          /* send timeout */
  363. #define SO_RCVTIMEO     0x1006          /* receive timeout */
  364. #define SO_ERROR        0x1007          /* get error status and clear */
  365. #define SO_TYPE         0x1008          /* get socket type */
  366. /*
  367.  * Options for connect and disconnect data and options.  Used only by
  368.  * non-TCP/IP transports such as DECNet, OSI TP4, etc.
  369.  */
  370. #define SO_CONNDATA     0x7000
  371. #define SO_CONNOPT      0x7001
  372. #define SO_DISCDATA     0x7002
  373. #define SO_DISCOPT      0x7003
  374. #define SO_CONNDATALEN  0x7004
  375. #define SO_CONNOPTLEN   0x7005
  376. #define SO_DISCDATALEN  0x7006
  377. #define SO_DISCOPTLEN   0x7007
  378. /*
  379.  * Option for opening sockets for synchronous access.
  380.  */
  381. #define SO_OPENTYPE     0x7008
  382. #define SO_SYNCHRONOUS_ALERT    0x10
  383. #define SO_SYNCHRONOUS_NONALERT 0x20
  384. /*
  385.  * Other NT-specific options.
  386.  */
  387. #define SO_MAXDG        0x7009
  388. #define SO_MAXPATHDG    0x700A
  389. #define SO_UPDATE_ACCEPT_CONTEXT 0x700B
  390. #define SO_CONNECT_TIME 0x700C
  391. /*
  392.  * TCP options.
  393.  */
  394. #define TCP_NODELAY     0x0001
  395. #define TCP_BSDURGENT   0x7000
  396. /*
  397.  * Address families.
  398.  */
  399. #define AF_UNSPEC       0               /* unspecified */
  400. #define AF_UNIX         1               /* local to host (pipes, portals) */
  401. #define AF_INET         2               /* internetwork: UDP, TCP, etc. */
  402. #define AF_IMPLINK      3               /* arpanet imp addresses */
  403. #define AF_PUP          4               /* pup protocols: e.g. BSP */
  404. #define AF_CHAOS        5               /* mit CHAOS protocols */
  405. #define AF_IPX          6               /* IPX and SPX */
  406. #define AF_NS           6               /* XEROX NS protocols */
  407. #define AF_ISO          7               /* ISO protocols */
  408. #define AF_OSI          AF_ISO          /* OSI is ISO */
  409. #define AF_ECMA         8               /* european computer manufacturers */
  410. #define AF_DATAKIT      9               /* datakit protocols */
  411. #define AF_CCITT        10              /* CCITT protocols, X.25 etc */
  412. #define AF_SNA          11              /* IBM SNA */
  413. #define AF_DECnet       12              /* DECnet */
  414. #define AF_DLI          13              /* Direct data link interface */
  415. #define AF_LAT          14              /* LAT */
  416. #define AF_HYLINK       15              /* NSC Hyperchannel */
  417. #define AF_APPLETALK    16              /* AppleTalk */
  418. #define AF_NETBIOS      17              /* NetBios-style addresses */
  419. #define AF_VOICEVIEW    18              /* VoiceView */
  420. #define AF_FIREFOX      19              /* FireFox */
  421. #define AF_UNKNOWN1     20              /* Somebody is using this! */
  422. #define AF_BAN          21              /* Banyan */
  423. #define AF_MAX          22
  424. /*
  425.  * Structure used by kernel to store most
  426.  * addresses.
  427.  */
  428. struct sockaddr {
  429.         u_short sa_family;              /* address family */
  430.         char    sa_data[14];            /* up to 14 bytes of direct address */
  431. };
  432. /*
  433.  * Structure used by kernel to pass protocol
  434.  * information in raw sockets.
  435.  */
  436. struct sockproto {
  437.         u_short sp_family;              /* address family */
  438.         u_short sp_protocol;            /* protocol */
  439. };
  440. /*
  441.  * Protocol families, same as address families for now.
  442.  */
  443. #define PF_UNSPEC       AF_UNSPEC
  444. #define PF_UNIX         AF_UNIX
  445. #define PF_INET         AF_INET
  446. #define PF_IMPLINK      AF_IMPLINK
  447. #define PF_PUP          AF_PUP
  448. #define PF_CHAOS        AF_CHAOS
  449. #define PF_NS           AF_NS
  450. #define PF_IPX          AF_IPX
  451. #define PF_ISO          AF_ISO
  452. #define PF_OSI          AF_OSI
  453. #define PF_ECMA         AF_ECMA
  454. #define PF_DATAKIT      AF_DATAKIT
  455. #define PF_CCITT        AF_CCITT
  456. #define PF_SNA          AF_SNA
  457. #define PF_DECnet       AF_DECnet
  458. #define PF_DLI          AF_DLI
  459. #define PF_LAT          AF_LAT
  460. #define PF_HYLINK       AF_HYLINK
  461. #define PF_APPLETALK    AF_APPLETALK
  462. #define PF_VOICEVIEW    AF_VOICEVIEW
  463. #define PF_FIREFOX      AF_FIREFOX
  464. #define PF_UNKNOWN1     AF_UNKNOWN1
  465. #define PF_BAN          AF_BAN
  466. #define PF_MAX          AF_MAX
  467. /*
  468.  * Structure used for manipulating linger option.
  469.  */
  470. struct  linger {
  471.         u_short l_onoff;                /* option on/off */
  472.         u_short l_linger;               /* linger time */
  473. };
  474. /*
  475.  * Level number for (get/set)sockopt() to apply to socket itself.
  476.  */
  477. #define SOL_SOCKET      0xffff          /* options for socket level */
  478. /*
  479.  * Maximum queue length specifiable by listen.
  480.  */
  481. #define SOMAXCONN       5
  482. #define MSG_OOB         0x1             /* process out-of-band data */
  483. #define MSG_PEEK        0x2             /* peek at incoming message */
  484. #define MSG_DONTROUTE   0x4             /* send without using routing tables */
  485. #define MSG_MAXIOVLEN   16
  486. #define MSG_PARTIAL     0x8000          /* partial send or recv for message xport */
  487. /*
  488.  * Define constant based on rfc883, used by gethostbyxxxx() calls.
  489.  */
  490. #define MAXGETHOSTSTRUCT        1024
  491. /*
  492.  * Define flags to be used with the WSAAsyncSelect() call.
  493.  */
  494. #define FD_READ         0x01
  495. #define FD_WRITE        0x02
  496. #define FD_OOB          0x04
  497. #define FD_ACCEPT       0x08
  498. #define FD_CONNECT      0x10
  499. #define FD_CLOSE        0x20
  500. /*
  501.  * WinSock error codes are also defined in winerror.h
  502.  * Hence the IFDEF.
  503.  */
  504. #ifndef WSABASEERR
  505. /*
  506.  * All Windows Sockets error constants are biased by WSABASEERR from
  507.  * the "normal"
  508.  */
  509. #define WSABASEERR              10000
  510. /*
  511.  * Windows Sockets definitions of regular Microsoft C error constants
  512.  */
  513. #define WSAEINTR                (WSABASEERR+4)
  514. #define WSAEBADF                (WSABASEERR+9)
  515. #define WSAEACCES               (WSABASEERR+13)
  516. #define WSAEFAULT               (WSABASEERR+14)
  517. #define WSAEINVAL               (WSABASEERR+22)
  518. #define WSAEMFILE               (WSABASEERR+24)
  519. /*
  520.  * Windows Sockets definitions of regular Berkeley error constants
  521.  */
  522. #define WSAEWOULDBLOCK          (WSABASEERR+35)
  523. #define WSAEINPROGRESS          (WSABASEERR+36)
  524. #define WSAEALREADY             (WSABASEERR+37)
  525. #define WSAENOTSOCK             (WSABASEERR+38)
  526. #define WSAEDESTADDRREQ         (WSABASEERR+39)
  527. #define WSAEMSGSIZE             (WSABASEERR+40)
  528. #define WSAEPROTOTYPE           (WSABASEERR+41)
  529. #define WSAENOPROTOOPT          (WSABASEERR+42)
  530. #define WSAEPROTONOSUPPORT      (WSABASEERR+43)
  531. #define WSAESOCKTNOSUPPORT      (WSABASEERR+44)
  532. #define WSAEOPNOTSUPP           (WSABASEERR+45)
  533. #define WSAEPFNOSUPPORT         (WSABASEERR+46)
  534. #define WSAEAFNOSUPPORT         (WSABASEERR+47)
  535. #define WSAEADDRINUSE           (WSABASEERR+48)
  536. #define WSAEADDRNOTAVAIL        (WSABASEERR+49)
  537. #define WSAENETDOWN             (WSABASEERR+50)
  538. #define WSAENETUNREACH          (WSABASEERR+51)
  539. #define WSAENETRESET            (WSABASEERR+52)
  540. #define WSAECONNABORTED         (WSABASEERR+53)
  541. #define WSAECONNRESET           (WSABASEERR+54)
  542. #define WSAENOBUFS              (WSABASEERR+55)
  543. #define WSAEISCONN              (WSABASEERR+56)
  544. #define WSAENOTCONN             (WSABASEERR+57)
  545. #define WSAESHUTDOWN            (WSABASEERR+58)
  546. #define WSAETOOMANYREFS         (WSABASEERR+59)
  547. #define WSAETIMEDOUT            (WSABASEERR+60)
  548. #define WSAECONNREFUSED         (WSABASEERR+61)
  549. #define WSAELOOP                (WSABASEERR+62)
  550. #define WSAENAMETOOLONG         (WSABASEERR+63)
  551. #define WSAEHOSTDOWN            (WSABASEERR+64)
  552. #define WSAEHOSTUNREACH         (WSABASEERR+65)
  553. #define WSAENOTEMPTY            (WSABASEERR+66)
  554. #define WSAEPROCLIM             (WSABASEERR+67)
  555. #define WSAEUSERS               (WSABASEERR+68)
  556. #define WSAEDQUOT               (WSABASEERR+69)
  557. #define WSAESTALE               (WSABASEERR+70)
  558. #define WSAEREMOTE              (WSABASEERR+71)
  559. #define WSAEDISCON              (WSABASEERR+101)
  560. /*
  561.  * Extended Windows Sockets error constant definitions
  562.  */
  563. #define WSASYSNOTREADY          (WSABASEERR+91)
  564. #define WSAVERNOTSUPPORTED      (WSABASEERR+92)
  565. #define WSANOTINITIALISED       (WSABASEERR+93)
  566. /*
  567.  * Error return codes from gethostbyname() and gethostbyaddr()
  568.  * (when using the resolver). Note that these errors are
  569.  * retrieved via WSAGetLastError() and must therefore follow
  570.  * the rules for avoiding clashes with error numbers from
  571.  * specific implementations or language run-time systems.
  572.  * For this reason the codes are based at WSABASEERR+1001.
  573.  * Note also that [WSA]NO_ADDRESS is defined only for
  574.  * compatibility purposes.
  575.  */
  576. /* Authoritative Answer: Host not found */
  577. #define WSAHOST_NOT_FOUND       (WSABASEERR+1001)
  578. /* Non-Authoritative: Host not found, or SERVERFAIL */
  579. #define WSATRY_AGAIN            (WSABASEERR+1002)
  580. /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */
  581. #define WSANO_RECOVERY          (WSABASEERR+1003)
  582. /* Valid name, no data record of requested type */
  583. #define WSANO_DATA              (WSABASEERR+1004)
  584. /*
  585.  * WinSock error codes are also defined in winerror.h
  586.  * Hence the IFDEF.
  587.  */
  588. #endif /* ifdef WSABASEERR */
  589. /*
  590.  * Compatibility macros.
  591.  */
  592. #define h_errno         WSAGetLastError()
  593. #define HOST_NOT_FOUND          WSAHOST_NOT_FOUND
  594. #define TRY_AGAIN               WSATRY_AGAIN
  595. #define NO_RECOVERY             WSANO_RECOVERY
  596. #define NO_DATA                 WSANO_DATA
  597. /* no address, look for MX record */
  598. #define WSANO_ADDRESS           WSANO_DATA
  599. #define NO_ADDRESS              WSANO_ADDRESS
  600. /*
  601.  * Windows Sockets errors redefined as regular Berkeley error constants.
  602.  * These are commented out in Windows NT to avoid conflicts with errno.h.
  603.  * Use the WSA constants instead.
  604.  */
  605. #if 0
  606. #define EWOULDBLOCK             WSAEWOULDBLOCK
  607. #define EINPROGRESS             WSAEINPROGRESS
  608. #define EALREADY                WSAEALREADY
  609. #define ENOTSOCK                WSAENOTSOCK
  610. #define EDESTADDRREQ            WSAEDESTADDRREQ
  611. #define EMSGSIZE                WSAEMSGSIZE
  612. #define EPROTOTYPE              WSAEPROTOTYPE
  613. #define ENOPROTOOPT             WSAENOPROTOOPT
  614. #define EPROTONOSUPPORT         WSAEPROTONOSUPPORT
  615. #define ESOCKTNOSUPPORT         WSAESOCKTNOSUPPORT
  616. #define EOPNOTSUPP              WSAEOPNOTSUPP
  617. #define EPFNOSUPPORT            WSAEPFNOSUPPORT
  618. #define EAFNOSUPPORT            WSAEAFNOSUPPORT
  619. #define EADDRINUSE              WSAEADDRINUSE
  620. #define EADDRNOTAVAIL           WSAEADDRNOTAVAIL
  621. #define ENETDOWN                WSAENETDOWN
  622. #define ENETUNREACH             WSAENETUNREACH
  623. #define ENETRESET               WSAENETRESET
  624. #define ECONNABORTED            WSAECONNABORTED
  625. #define ECONNRESET              WSAECONNRESET
  626. #define ENOBUFS                 WSAENOBUFS
  627. #define EISCONN                 WSAEISCONN
  628. #define ENOTCONN                WSAENOTCONN
  629. #define ESHUTDOWN               WSAESHUTDOWN
  630. #define ETOOMANYREFS            WSAETOOMANYREFS
  631. #define ETIMEDOUT               WSAETIMEDOUT
  632. #define ECONNREFUSED            WSAECONNREFUSED
  633. #define ELOOP                   WSAELOOP
  634. #define ENAMETOOLONG            WSAENAMETOOLONG
  635. #define EHOSTDOWN               WSAEHOSTDOWN
  636. #define EHOSTUNREACH            WSAEHOSTUNREACH
  637. #define ENOTEMPTY               WSAENOTEMPTY
  638. #define EPROCLIM                WSAEPROCLIM
  639. #define EUSERS                  WSAEUSERS
  640. #define EDQUOT                  WSAEDQUOT
  641. #define ESTALE                  WSAESTALE
  642. #define EREMOTE                 WSAEREMOTE
  643. #endif
  644. /* Socket function prototypes */
  645. #ifdef __cplusplus
  646. extern "C" {
  647. #endif
  648. SOCKET PASCAL FAR accept (
  649.                           IN SOCKET s,
  650.                           OUT struct sockaddr FAR *addr,
  651.                           IN OUT int FAR *addrlen);
  652. int PASCAL FAR bind (
  653.                      IN SOCKET s,
  654.                      IN const struct sockaddr FAR *addr,
  655.                      IN int namelen);
  656. int PASCAL FAR closesocket ( IN SOCKET s);
  657. int PASCAL FAR connect (
  658.                         IN SOCKET s,
  659.                         IN const struct sockaddr FAR *name,
  660.                         IN int namelen);
  661. int PASCAL FAR ioctlsocket (
  662.                             IN SOCKET s,
  663.                             IN long cmd,
  664.                             IN OUT u_long FAR *argp);
  665. int PASCAL FAR getpeername (
  666.                             IN SOCKET s,
  667.                             OUT struct sockaddr FAR *name,
  668.                             IN OUT int FAR * namelen);
  669. int PASCAL FAR getsockname (
  670.                             IN SOCKET s,
  671.                             OUT struct sockaddr FAR *name,
  672.                             IN OUT int FAR * namelen);
  673. int PASCAL FAR getsockopt (
  674.                            IN SOCKET s,
  675.                            IN int level,
  676.                            IN int optname,
  677.                            OUT char FAR * optval,
  678.                            IN OUT int FAR *optlen);
  679. u_long PASCAL FAR htonl ( IN u_long hostlong);
  680. u_short PASCAL FAR htons (IN u_short hostshort);
  681. unsigned long PASCAL FAR inet_addr (IN const char FAR * cp);
  682. char FAR * PASCAL FAR inet_ntoa (IN struct in_addr in);
  683. int PASCAL FAR listen (
  684.                        IN SOCKET s,
  685.                        IN int backlog);
  686. u_long PASCAL FAR ntohl (IN u_long netlong);
  687. u_short PASCAL FAR ntohs (IN u_short netshort);
  688. int PASCAL FAR recv (
  689.                      IN SOCKET s,
  690.                      OUT char FAR * buf,
  691.                      IN int len,
  692.                      IN int flags);
  693. int PASCAL FAR recvfrom (
  694.                          IN SOCKET s,
  695.                          OUT char FAR * buf,
  696.                          IN int len,
  697.                          IN int flags,
  698.                          OUT struct sockaddr FAR *from,
  699.                          IN OUT int FAR * fromlen);
  700. int PASCAL FAR select (
  701.                         IN int nfds,
  702.                         IN OUT fd_set FAR *readfds,
  703.                         IN OUT fd_set FAR *writefds,
  704.                         IN OUT fd_set FAR *exceptfds,
  705.                         IN const struct timeval FAR *timeout);
  706. int PASCAL FAR send (
  707.                      IN SOCKET s,
  708.                      IN const char FAR * buf,
  709.                      IN int len,
  710.                      IN int flags);
  711. int PASCAL FAR sendto (
  712.                        IN SOCKET s,
  713.                        IN const char FAR * buf,
  714.                        IN int len,
  715.                        IN int flags,
  716.                        IN const struct sockaddr FAR *to,
  717.                        IN int tolen);
  718. int PASCAL FAR setsockopt (
  719.                            IN SOCKET s,
  720.                            IN int level,
  721.                            IN int optname,
  722.                            IN const char FAR * optval,
  723.                            IN int optlen);
  724. int PASCAL FAR shutdown (
  725.                          IN SOCKET s,
  726.                          IN int how);
  727. SOCKET PASCAL FAR socket (
  728.                           IN int af,
  729.                           IN int type,
  730.                           IN int protocol);
  731. /* Database function prototypes */
  732. struct hostent FAR * PASCAL FAR gethostbyaddr(
  733.                                               IN const char FAR * addr,
  734.                                               IN int len,
  735.                                               IN int type);
  736. struct hostent FAR * PASCAL FAR gethostbyname(IN const char FAR * name);
  737. int PASCAL FAR gethostname (
  738.                             OUT char FAR * name,
  739.                             IN int namelen);
  740. struct servent FAR * PASCAL FAR getservbyport(
  741.                                               IN int port,
  742.                                               IN const char FAR * proto);
  743. struct servent FAR * PASCAL FAR getservbyname(
  744.                                               IN const char FAR * name,
  745.                                               IN const char FAR * proto);
  746. struct protoent FAR * PASCAL FAR getprotobynumber(IN int proto);
  747. struct protoent FAR * PASCAL FAR getprotobyname(IN const char FAR * name);
  748. /* Microsoft Windows Extension function prototypes */
  749. int PASCAL FAR WSAStartup(
  750.                           IN WORD wVersionRequired,
  751.                           OUT LPWSADATA lpWSAData);
  752. int PASCAL FAR WSACleanup(void);
  753. void PASCAL FAR WSASetLastError(IN int iError);
  754. int PASCAL FAR WSAGetLastError(void);
  755. BOOL PASCAL FAR WSAIsBlocking(void);
  756. int PASCAL FAR WSAUnhookBlockingHook(void);
  757. FARPROC PASCAL FAR WSASetBlockingHook(IN FARPROC lpBlockFunc);
  758. int PASCAL FAR WSACancelBlockingCall(void);
  759. HANDLE PASCAL FAR WSAAsyncGetServByName(
  760.                                         IN HWND hWnd,
  761.                                         IN u_int wMsg,
  762.                                         IN const char FAR * name,
  763.                                         IN const char FAR * proto,
  764.                                         OUT char FAR * buf,
  765.                                         IN int buflen);
  766. HANDLE PASCAL FAR WSAAsyncGetServByPort(
  767.                                         IN HWND hWnd,
  768.                                         IN u_int wMsg,
  769.                                         IN int port,
  770.                                         IN const char FAR * proto,
  771.                                         OUT char FAR * buf,
  772.                                         IN int buflen);
  773. HANDLE PASCAL FAR WSAAsyncGetProtoByName(
  774.                                          IN HWND hWnd,
  775.                                          IN u_int wMsg,
  776.                                          IN const char FAR * name,
  777.                                          OUT char FAR * buf,
  778.                                          IN int buflen);
  779. HANDLE PASCAL FAR WSAAsyncGetProtoByNumber(
  780.                                            IN HWND hWnd,
  781.                                            IN u_int wMsg,
  782.                                            IN int number,
  783.                                            OUT char FAR * buf,
  784.                                            IN int buflen);
  785. HANDLE PASCAL FAR WSAAsyncGetHostByName(
  786.                                         IN HWND hWnd,
  787.                                         IN u_int wMsg,
  788.                                         IN const char FAR * name,
  789.                                         OUT char FAR * buf,
  790.                                         IN int buflen);
  791. HANDLE PASCAL FAR WSAAsyncGetHostByAddr(
  792.                                         IN HWND hWnd,
  793.                                         IN u_int wMsg,
  794.                                         IN const char FAR * addr,
  795.                                         IN int len,
  796.                                         IN int type,
  797.                                         OUT char FAR * buf,
  798.                                         IN int buflen);
  799. int PASCAL FAR WSACancelAsyncRequest(IN HANDLE hAsyncTaskHandle);
  800. int PASCAL FAR WSAAsyncSelect(
  801.                               IN SOCKET s,
  802.                               IN HWND hWnd,
  803.                               IN u_int wMsg,
  804.                               IN long lEvent);
  805. int PASCAL FAR WSARecvEx (
  806.                           IN SOCKET s,
  807.                           OUT char FAR * buf,
  808.                           IN int len,
  809.                           IN OUT int FAR *flags);
  810. typedef struct _TRANSMIT_FILE_BUFFERS {
  811.     PVOID Head;
  812.     DWORD HeadLength;
  813.     PVOID Tail;
  814.     DWORD TailLength;
  815. } TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, *LPTRANSMIT_FILE_BUFFERS;
  816. #define TF_DISCONNECT       0x01
  817. #define TF_REUSE_SOCKET     0x02
  818. #define TF_WRITE_BEHIND     0x04
  819. BOOL
  820. PASCAL FAR
  821. TransmitFile (
  822.     IN SOCKET hSocket,
  823.     IN HANDLE hFile,
  824.     IN DWORD nNumberOfBytesToWrite,
  825.     IN DWORD nNumberOfBytesPerSend,
  826.     IN LPOVERLAPPED lpOverlapped,
  827.     IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
  828.     IN DWORD dwReserved
  829.     );
  830. BOOL
  831. PASCAL FAR
  832. AcceptEx (
  833.     IN SOCKET sListenSocket,
  834.     IN SOCKET sAcceptSocket,
  835.     IN PVOID lpOutputBuffer,
  836.     IN DWORD dwReceiveDataLength,
  837.     IN DWORD dwLocalAddressLength,
  838.     IN DWORD dwRemoteAddressLength,
  839.     OUT LPDWORD lpdwBytesReceived,
  840.     IN LPOVERLAPPED lpOverlapped
  841.     );
  842. VOID
  843. PASCAL FAR
  844. GetAcceptExSockaddrs (
  845.     IN PVOID lpOutputBuffer,
  846.     IN DWORD dwReceiveDataLength,
  847.     IN DWORD dwLocalAddressLength,
  848.     IN DWORD dwRemoteAddressLength,
  849.     OUT struct sockaddr **LocalSockaddr,
  850.     OUT LPINT LocalSockaddrLength,
  851.     OUT struct sockaddr **RemoteSockaddr,
  852.     OUT LPINT RemoteSockaddrLength
  853.     );
  854. #ifdef __cplusplus
  855. }
  856. #endif
  857. /* Microsoft Windows Extended data types */
  858. typedef struct sockaddr SOCKADDR;
  859. typedef struct sockaddr *PSOCKADDR;
  860. typedef struct sockaddr FAR *LPSOCKADDR;
  861. typedef struct sockaddr_in SOCKADDR_IN;
  862. typedef struct sockaddr_in *PSOCKADDR_IN;
  863. typedef struct sockaddr_in FAR *LPSOCKADDR_IN;
  864. typedef struct linger LINGER;
  865. typedef struct linger *PLINGER;
  866. typedef struct linger FAR *LPLINGER;
  867. typedef struct in_addr IN_ADDR;
  868. typedef struct in_addr *PIN_ADDR;
  869. typedef struct in_addr FAR *LPIN_ADDR;
  870. typedef struct fd_set FD_SET;
  871. typedef struct fd_set *PFD_SET;
  872. typedef struct fd_set FAR *LPFD_SET;
  873. typedef struct hostent HOSTENT;
  874. typedef struct hostent *PHOSTENT;
  875. typedef struct hostent FAR *LPHOSTENT;
  876. typedef struct servent SERVENT;
  877. typedef struct servent *PSERVENT;
  878. typedef struct servent FAR *LPSERVENT;
  879. typedef struct protoent PROTOENT;
  880. typedef struct protoent *PPROTOENT;
  881. typedef struct protoent FAR *LPPROTOENT;
  882. typedef struct timeval TIMEVAL;
  883. typedef struct timeval *PTIMEVAL;
  884. typedef struct timeval FAR *LPTIMEVAL;
  885. /*
  886.  * Windows message parameter composition and decomposition
  887.  * macros.
  888.  *
  889.  * WSAMAKEASYNCREPLY is intended for use by the Windows Sockets implementation
  890.  * when constructing the response to a WSAAsyncGetXByY() routine.
  891.  */
  892. #define WSAMAKEASYNCREPLY(buflen,error)     MAKELONG(buflen,error)
  893. /*
  894.  * WSAMAKESELECTREPLY is intended for use by the Windows Sockets implementation
  895.  * when constructing the response to WSAAsyncSelect().
  896.  */
  897. #define WSAMAKESELECTREPLY(event,error)     MAKELONG(event,error)
  898. /*
  899.  * WSAGETASYNCBUFLEN is intended for use by the Windows Sockets application
  900.  * to extract the buffer length from the lParam in the response
  901.  * to a WSAGetXByY().
  902.  */
  903. #define WSAGETASYNCBUFLEN(lParam)           LOWORD(lParam)
  904. /*
  905.  * WSAGETASYNCERROR is intended for use by the Windows Sockets application
  906.  * to extract the error code from the lParam in the response
  907.  * to a WSAGetXByY().
  908.  */
  909. #define WSAGETASYNCERROR(lParam)            HIWORD(lParam)
  910. /*
  911.  * WSAGETSELECTEVENT is intended for use by the Windows Sockets application
  912.  * to extract the event code from the lParam in the response
  913.  * to a WSAAsyncSelect().
  914.  */
  915. #define WSAGETSELECTEVENT(lParam)           LOWORD(lParam)
  916. /*
  917.  * WSAGETSELECTERROR is intended for use by the Windows Sockets application
  918.  * to extract the error code from the lParam in the response
  919.  * to a WSAAsyncSelect().
  920.  */
  921. #define WSAGETSELECTERROR(lParam)           HIWORD(lParam)
  922. #ifdef IPV6STRICT
  923. #error WINSOCK2 required.
  924. #endif // IPV6STRICT
  925. #endif  /* _WINSOCKAPI_ */