JwaWinSock.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:60k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Winsock API interface Unit for Object Pascal                                 }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: winsock.h, released June 2000. The original Pascal     }
  9. { code is: WinSock.pas, released December 2000. The initial developer of the   }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaWinSock;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "winsock.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   JwaWinType, JwaWinBase;
  52. (*
  53.  * Basic system type definitions, taken from the BSD file sys/types.h.
  54.  *)
  55. type
  56.   u_char = Byte;
  57.   {$EXTERNALSYM u_char}
  58.   u_short = Word;
  59.   {$EXTERNALSYM u_short}
  60.   u_int = Cardinal;
  61.   {$EXTERNALSYM u_int}
  62.   u_long = Cardinal;
  63.   {$EXTERNALSYM u_long}
  64. (*
  65.  * The new type to be used in all
  66.  * instances which refer to sockets.
  67.  *)
  68. type
  69.   TSocket = UINT_PTR;
  70. (*
  71.  * Select uses arrays of SOCKETs.  These macros manipulate such
  72.  * arrays.  FD_SETSIZE may be defined by the user before including
  73.  * this file, but the default here should be >= 64.
  74.  *
  75.  * CAVEAT IMPLEMENTOR and USER: THESE MACROS AND TYPES MUST BE
  76.  * INCLUDED IN WINSOCK.H EXACTLY AS SHOWN HERE.
  77.  *)
  78. const
  79.   FD_SETSIZE = 64;
  80.   {$EXTERNALSYM FD_SETSIZE}
  81. type
  82.   fd_set = record
  83.     fd_count: u_int;                                 // how many are SET?
  84.     fd_array: array [0..FD_SETSIZE - 1] of TSocket;   // an array of SOCKETs
  85.   end;
  86.   {$EXTERNALSYM fd_set}
  87.   TFdSet = fd_set;
  88.   PFdSet = ^fd_set;
  89. function __WSAFDIsSet(s: TSocket; var FDSet: TFDSet): Integer; stdcall;
  90. {$EXTERNALSYM __WSAFDIsSet}
  91. procedure FD_CLR(fd: TSocket; var fdset: TFdSet);
  92. {$EXTERNALSYM FD_CLR}
  93. procedure _FD_SET(fd: TSocket; var fdset: TFDSet);
  94. //{$EXTERNALSYM FD_SET}
  95. procedure FD_ZERO(var fdset: TFdSet);
  96. {$EXTERNALSYM FD_ZERO}
  97. function FD_ISSET(fd: TSocket; var fdset: TFdSet): Boolean;
  98. {$EXTERNALSYM FD_ISSET}
  99. (*
  100.  * Structure used in select() call, taken from the BSD file sys/time.h.
  101.  *)
  102. type
  103.   timeval = record
  104.     tv_sec: Longint;         // seconds
  105.     tv_usec: Longint;        // and microseconds
  106.   end;
  107.   {$EXTERNALSYM timeval}
  108.   TTimeVal = timeval;
  109.   PTimeVal = ^timeval;
  110. (*
  111.  * Operations on timevals.
  112.  *
  113.  * NB: timercmp does not work for >= or <=.
  114.  *)
  115. function timerisset(const tvp: TTimeVal): Boolean;
  116. {$EXTERNALSYM timerisset}
  117. //function timercmp(const tvp, uvp: TTimeVal; cmp): Boolean;
  118. //{$EXTERNALSYM timercmp}
  119. procedure timerclear(var tvp: TTimeVal);
  120. {$EXTERNALSYM timerclear}
  121. (*
  122.  * Commands for ioctlsocket(),  taken from the BSD file fcntl.h.
  123.  *
  124.  *
  125.  * Ioctl's have the command encoded in the lower word,
  126.  * and the size of any in or out parameters in the upper
  127.  * word.  The high 2 bits of the upper word are used
  128.  * to encode the in/out status of the parameter; for now
  129.  * we restrict parameters to at most 128 bytes.
  130.  *)
  131. const
  132.   IOCPARM_MASK = $7f;              // parameters must be < 128 bytes
  133.   {$EXTERNALSYM IOCPARM_MASK}
  134.   IOC_VOID     = $20000000;        // no parameters
  135.   {$EXTERNALSYM IOC_VOID}
  136.   IOC_OUT      = $40000000;        // copy out parameters
  137.   {$EXTERNALSYM IOC_OUT}
  138.   IOC_IN       = DWORD($80000000); // copy in parameters
  139.   {$EXTERNALSYM IOC_IN}
  140.   IOC_INOUT    = DWORD(IOC_IN or IOC_OUT);
  141.   {$EXTERNALSYM IOC_INOUT}
  142.   // 0x20000000 distinguishes new & old ioctl's
  143. function _IO(x, y: DWORD): DWORD;
  144. {$EXTERNALSYM _IO}
  145. function _IOR(x, y, t: DWORD): DWORD;
  146. {$EXTERNALSYM _IOR}
  147. function _IOW(x, y, t: DWORD): DWORD;
  148. {$EXTERNALSYM _IOW}
  149. const
  150.   FIONREAD = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 127; // get # bytes to read
  151.   {$EXTERNALSYM FIONREAD}
  152.   FIONBIO = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 126; // set/clear non-blocking i/o
  153.   {$EXTERNALSYM FIONBIO}
  154.   FIOASYNC = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 125; // set/clear async i/o
  155.   {$EXTERNALSYM FIOASYNC}
  156. (* Socket I/O Controls *)
  157.   SIOCSHIWAT = DWORD(IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 0); // set high watermark
  158.   {$EXTERNALSYM SIOCSHIWAT}
  159.   SIOCGHIWAT = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 1; // get high watermark
  160.   {$EXTERNALSYM SIOCGHIWAT}
  161.   SIOCSLOWAT = DWORD(IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 2); // set low watermark
  162.   {$EXTERNALSYM SIOCSLOWAT}
  163.   SIOCGLOWAT = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 3; // get low watermark
  164.   {$EXTERNALSYM SIOCGLOWAT}
  165.   SIOCATMARK = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 7; // at oob mark?
  166.   {$EXTERNALSYM SIOCATMARK}
  167. (*
  168.  * Structures returned by network data base library, taken from the
  169.  * BSD file netdb.h.  All addresses are supplied in host order, and
  170.  * returned in network order (suitable for use in system calls).
  171.  *)
  172. type
  173.   hostent = record
  174.     h_name: PChar;           // official name of host
  175.     h_aliases: PPChar;  // alias list
  176.     h_addrtype: Smallint;             // host address type
  177.     h_length: Smallint;               // length of address
  178.     case Integer of
  179.       0: (h_addr_list: PPChar); // list of addresses
  180.       1: (h_addr: PPChar);          // address, for backward compat
  181.   end;
  182.   {$EXTERNALSYM hostent}
  183.   THostEnt = hostent;
  184.   PHostEnt = ^hostent;
  185. (*
  186.  * It is assumed here that a network number
  187.  * fits in 32 bits.
  188.  *)
  189. type
  190.   netent = record
  191.     n_name: PChar;           // official name of net
  192.     n_aliases: PPChar;  // alias list
  193.     n_addrtype: Smallint;             // net address type
  194.     n_net: u_long;                  // network #
  195.   end;
  196.   {$EXTERNALSYM netent}
  197.   TNetEnt = netent;
  198.   PNetEnt = ^netent;
  199.   servent = record
  200.     s_name: PChar;           // official service name
  201.     s_aliases: PPChar;  // alias list
  202.     s_port: Smallint;                 // port #
  203.     s_proto: PChar;          // protocol to use
  204.   end;
  205.   {$EXTERNALSYM servent}
  206.   TServEnt = servent;
  207.   PServEnt = ^servent;
  208.   protoent = record
  209.     p_name: PChar;           // official protocol name
  210.     p_aliases: PPChar;  // alias list
  211.     p_proto: Smallint;                // protocol #
  212.   end;
  213.   {$EXTERNALSYM protoent}
  214.   TProtoEnt = protoent;
  215.   PProtoEnt = ^protoent;
  216. (*
  217.  * Constants and structures defined by the internet system,
  218.  * Per RFC 790, September 1981, taken from the BSD file netinet/in.h.
  219.  *)
  220. (*
  221.  * Protocols
  222.  *)
  223. const
  224.   IPPROTO_IP   = 0; // dummy for IP
  225.   {$EXTERNALSYM IPPROTO_IP}
  226.   IPPROTO_ICMP = 1; // control message protocol
  227.   {$EXTERNALSYM IPPROTO_ICMP}
  228.   IPPROTO_IGMP = 2; // internet group management protocol
  229.   {$EXTERNALSYM IPPROTO_IGMP}
  230.   IPPROTO_GGP  = 3; // gateway^2 (deprecated)
  231.   {$EXTERNALSYM IPPROTO_GGP}
  232.   IPPROTO_TCP  = 6; // tcp
  233.   {$EXTERNALSYM IPPROTO_TCP}
  234.   IPPROTO_PUP  = 12; // pup
  235.   {$EXTERNALSYM IPPROTO_PUP}
  236.   IPPROTO_UDP  = 17; // user datagram protocol
  237.   {$EXTERNALSYM IPPROTO_UDP}
  238.   IPPROTO_IDP  = 22; // xns idp
  239.   {$EXTERNALSYM IPPROTO_IDP}
  240.   IPPROTO_ND   = 77; // UNOFFICIAL net disk proto
  241.   {$EXTERNALSYM IPPROTO_ND}
  242.   IPPROTO_RAW  = 255; // raw IP packet
  243.   {$EXTERNALSYM IPPROTO_RAW}
  244.   IPPROTO_MAX  = 256;
  245.   {$EXTERNALSYM IPPROTO_MAX}
  246. (*
  247.  * Port/socket numbers: network standard functions
  248.  *)
  249.   IPPORT_ECHO       = 7;
  250.   {$EXTERNALSYM IPPORT_ECHO}
  251.   IPPORT_DISCARD    = 9;
  252.   {$EXTERNALSYM IPPORT_DISCARD}
  253.   IPPORT_SYSTAT     = 11;
  254.   {$EXTERNALSYM IPPORT_SYSTAT}
  255.   IPPORT_DAYTIME    = 13;
  256.   {$EXTERNALSYM IPPORT_DAYTIME}
  257.   IPPORT_NETSTAT    = 15;
  258.   {$EXTERNALSYM IPPORT_NETSTAT}
  259.   IPPORT_FTP        = 21;
  260.   {$EXTERNALSYM IPPORT_FTP}
  261.   IPPORT_TELNET     = 23;
  262.   {$EXTERNALSYM IPPORT_TELNET}
  263.   IPPORT_SMTP       = 25;
  264.   {$EXTERNALSYM IPPORT_SMTP}
  265.   IPPORT_TIMESERVER = 37;
  266.   {$EXTERNALSYM IPPORT_TIMESERVER}
  267.   IPPORT_NAMESERVER = 42;
  268.   {$EXTERNALSYM IPPORT_NAMESERVER}
  269.   IPPORT_WHOIS      = 43;
  270.   {$EXTERNALSYM IPPORT_WHOIS}
  271.   IPPORT_MTP        = 57;
  272.   {$EXTERNALSYM IPPORT_MTP}
  273. (*
  274.  * Port/socket numbers: host specific functions
  275.  *)
  276.   IPPORT_TFTP    = 69;
  277.   {$EXTERNALSYM IPPORT_TFTP}
  278.   IPPORT_RJE     = 77;
  279.   {$EXTERNALSYM IPPORT_RJE}
  280.   IPPORT_FINGER  = 79;
  281.   {$EXTERNALSYM IPPORT_FINGER}
  282.   IPPORT_TTYLINK = 87;
  283.   {$EXTERNALSYM IPPORT_TTYLINK}
  284.   IPPORT_SUPDUP  = 95;
  285.   {$EXTERNALSYM IPPORT_SUPDUP}
  286. (*
  287.  * UNIX TCP sockets
  288.  *)
  289.   IPPORT_EXECSERVER  = 512;
  290.   {$EXTERNALSYM IPPORT_EXECSERVER}
  291.   IPPORT_LOGINSERVER = 513;
  292.   {$EXTERNALSYM IPPORT_LOGINSERVER}
  293.   IPPORT_CMDSERVER   = 514;
  294.   {$EXTERNALSYM IPPORT_CMDSERVER}
  295.   IPPORT_EFSSERVER   = 520;
  296.   {$EXTERNALSYM IPPORT_EFSSERVER}
  297. (*
  298.  * UNIX UDP sockets
  299.  *)
  300.   IPPORT_BIFFUDP     = 512;
  301.   {$EXTERNALSYM IPPORT_BIFFUDP}
  302.   IPPORT_WHOSERVER   = 513;
  303.   {$EXTERNALSYM IPPORT_WHOSERVER}
  304.   IPPORT_ROUTESERVER = 520;
  305.   {$EXTERNALSYM IPPORT_ROUTESERVER}
  306.   (* 520+1 also used *)
  307. (*
  308.  * Ports < IPPORT_RESERVED are reserved for
  309.  * privileged processes (e.g. root).
  310.  *)
  311.   IPPORT_RESERVED = 1024;
  312.   {$EXTERNALSYM IPPORT_RESERVED}
  313. (*
  314.  * Link numbers
  315.  *)
  316.   IMPLINK_IP        = 155;
  317.   {$EXTERNALSYM IMPLINK_IP}
  318.   IMPLINK_LOWEXPER  = 156;
  319.   {$EXTERNALSYM IMPLINK_LOWEXPER}
  320.   IMPLINK_HIGHEXPER = 158;
  321.   {$EXTERNALSYM IMPLINK_HIGHEXPER}
  322. (*
  323.  * Internet address (old style... should be updated)
  324.  *)
  325. type
  326.   SunB = packed record
  327.     s_b1, s_b2, s_b3, s_b4: u_char;
  328.   end;
  329.   {$EXTERNALSYM SunB}
  330.   SunW = packed record
  331.     s_w1, s_w2: u_short;
  332.   end;
  333.   {$EXTERNALSYM SunW}
  334.   in_addr = record
  335.     case Integer of
  336.       0: (S_un_b: SunB);
  337.       1: (S_un_w: SunW);
  338.       2: (S_addr: u_long);
  339.     // #define s_addr  S_un.S_addr // can be used for most tcp & ip code
  340.     // #define s_host  S_un.S_un_b.s_b2 // host on imp
  341.     // #define s_net   S_un.S_un_b.s_b1  // netword
  342.     // #define s_imp   S_un.S_un_w.s_w2 // imp
  343.     // #define s_impno S_un.S_un_b.s_b4 // imp #
  344.     // #define s_lh    S_un.S_un_b.s_b3 // logical host
  345.   end;
  346.   {$EXTERNALSYM in_addr}
  347.   TInAddr = in_addr;
  348.   PInAddr = ^in_addr;
  349. (*
  350.  * Definitions of bits in internet address integers.
  351.  * On subnets, the decomposition of addresses to host and net parts
  352.  * is done according to subnet mask, not the masks here.
  353.  *)
  354. function IN_CLASSA(i: DWORD): Boolean;
  355. {$EXTERNALSYM IN_CLASSA}
  356. const
  357.   IN_CLASSA_NET    = DWORD($ff000000);
  358.   {$EXTERNALSYM IN_CLASSA_NET}
  359.   IN_CLASSA_NSHIFT = 24;
  360.   {$EXTERNALSYM IN_CLASSA_NSHIFT}
  361.   IN_CLASSA_HOST   = $00ffffff;
  362.   {$EXTERNALSYM IN_CLASSA_HOST}
  363.   IN_CLASSA_MAX    = 128;
  364.   {$EXTERNALSYM IN_CLASSA_MAX}
  365. function IN_CLASSB(i: DWORD): Boolean;
  366. {$EXTERNALSYM IN_CLASSB}
  367. const
  368.   IN_CLASSB_NET    = DWORD($ffff0000);
  369.   {$EXTERNALSYM IN_CLASSB_NET}
  370.   IN_CLASSB_NSHIFT = 16;
  371.   {$EXTERNALSYM IN_CLASSB_NSHIFT}
  372.   IN_CLASSB_HOST   = $0000ffff;
  373.   {$EXTERNALSYM IN_CLASSB_HOST}
  374.   IN_CLASSB_MAX    = 65536;
  375.   {$EXTERNALSYM IN_CLASSB_MAX}
  376. function IN_CLASSC(i: DWORD): Boolean;
  377. {$EXTERNALSYM IN_CLASSC}
  378. const
  379.   IN_CLASSC_NET    = DWORD($ffffff00);
  380.   {$EXTERNALSYM IN_CLASSC_NET}
  381.   IN_CLASSC_NSHIFT = 8;
  382.   {$EXTERNALSYM IN_CLASSC_NSHIFT}
  383.   IN_CLASSC_HOST   = $000000ff;
  384.   {$EXTERNALSYM IN_CLASSC_HOST}
  385. const
  386.   INADDR_ANY       = u_long($00000000);
  387.   {$EXTERNALSYM INADDR_ANY}
  388.   INADDR_LOOPBACK  = $7f000001;
  389.   {$EXTERNALSYM INADDR_LOOPBACK}
  390.   INADDR_BROADCAST = u_long($ffffffff);
  391.   {$EXTERNALSYM INADDR_BROADCAST}
  392.   INADDR_NONE      = DWORD($ffffffff);
  393.   {$EXTERNALSYM INADDR_NONE}
  394. (*
  395.  * Socket address, internet style.
  396.  *)
  397. type
  398.   sockaddr_in = record
  399.     sin_family: Smallint;
  400.     sin_port: u_short;
  401.     sin_addr: in_addr;
  402.     sin_zero: array [0..7] of Char;
  403.   end;
  404.   {$EXTERNALSYM sockaddr_in}
  405.   TSockAddrIn = sockaddr_in;
  406.   PSockAddrIn = ^sockaddr_in;
  407. const
  408.   WSADESCRIPTION_LEN = 256;
  409.   {$EXTERNALSYM WSADESCRIPTION_LEN}
  410.   WSASYS_STATUS_LEN  = 128;
  411.   {$EXTERNALSYM WSASYS_STATUS_LEN}
  412. type
  413.   WSAData = record
  414.     wVersion: WORD;
  415.     wHighVersion: WORD;
  416.     szDescription: array [0..WSADESCRIPTION_LEN] of Char;
  417.     szSystemStatus: array [0..WSASYS_STATUS_LEN] of Char;
  418.     iMaxSockets: Word;
  419.     iMaxUdpDg: Word;
  420.     lpVendorInfo: PChar;
  421.   end;
  422.   {$EXTERNALSYM WSAData}
  423.   LPWSADATA = ^WSAData;
  424.   {$EXTERNALSYM LPWSADATA}
  425.   TWsaData = WSAData;
  426.   PWsaData = LPWSADATA;
  427. (*
  428.  * Options for use with [gs]etsockopt at the IP level.
  429.  *)
  430. const
  431.   IP_OPTIONS         = 1;           (* set/get IP per-packet options    *)
  432.   {$EXTERNALSYM IP_OPTIONS}
  433.   IP_MULTICAST_IF    = 2;           (* set/get IP multicast interface   *)
  434.   {$EXTERNALSYM IP_MULTICAST_IF}
  435.   IP_MULTICAST_TTL   = 3;           (* set/get IP multicast timetolive  *)
  436.   {$EXTERNALSYM IP_MULTICAST_TTL}
  437.   IP_MULTICAST_LOOP  = 4;           (* set/get IP multicast loopback    *)
  438.   {$EXTERNALSYM IP_MULTICAST_LOOP}
  439.   IP_ADD_MEMBERSHIP  = 5;           (* add  an IP group membership      *)
  440.   {$EXTERNALSYM IP_ADD_MEMBERSHIP}
  441.   IP_DROP_MEMBERSHIP = 6;           (* drop an IP group membership      *)
  442.   {$EXTERNALSYM IP_DROP_MEMBERSHIP}
  443.   IP_TTL             = 7;           (* set/get IP Time To Live          *)
  444.   {$EXTERNALSYM IP_TTL}
  445.   IP_TOS             = 8;           (* set/get IP Type Of Service       *)
  446.   {$EXTERNALSYM IP_TOS}
  447.   IP_DONTFRAGMENT    = 9;           (* set/get IP Don't Fragment flag   *)
  448.   {$EXTERNALSYM IP_DONTFRAGMENT}
  449.   IP_DEFAULT_MULTICAST_TTL  = 1;    (* normally limit m'casts to 1 hop  *)
  450.   {$EXTERNALSYM IP_DEFAULT_MULTICAST_TTL}
  451.   IP_DEFAULT_MULTICAST_LOOP = 1;    (* normally hear sends if a member  *)
  452.   {$EXTERNALSYM IP_DEFAULT_MULTICAST_LOOP}
  453.   IP_MAX_MEMBERSHIPS        = 20;   (* per socket; must fit in one mbuf *)
  454.   {$EXTERNALSYM IP_MAX_MEMBERSHIPS}
  455. (*
  456.  * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP.
  457.  *)
  458. type
  459.   ip_mreq = record
  460.     imr_multiaddr: in_addr;  (* IP multicast address of group *)
  461.     mr_interface: in_addr;  (* local IP address of interface *)
  462.   end;
  463.   {$EXTERNALSYM ip_mreq}
  464.   TIpMReq = ip_mreq;
  465.   PIpMReq = ^ip_mreq;  
  466. (*
  467.  * Definitions related to sockets: types, address families, options,
  468.  * taken from the BSD file sys/socket.h.
  469.  *)
  470. (*
  471.  * This is used instead of -1, since the
  472.  * SOCKET type is unsigned.
  473.  *)
  474. const
  475.   INVALID_SOCKET = TSocket(not 0);
  476.   {$EXTERNALSYM INVALID_SOCKET}
  477.   SOCKET_ERROR   = -1;
  478.   {$EXTERNALSYM SOCKET_ERROR}
  479. (*
  480.  * Types
  481.  *)
  482.   SOCK_STREAM    = 1; // stream socket
  483.   {$EXTERNALSYM SOCK_STREAM}
  484.   SOCK_DGRAM     = 2; // datagram socket
  485.   {$EXTERNALSYM SOCK_DGRAM}
  486.   SOCK_RAW       = 3; // raw-protocol interface
  487.   {$EXTERNALSYM SOCK_RAW}
  488.   SOCK_RDM       = 4; // reliably-delivered message
  489.   {$EXTERNALSYM SOCK_RDM}
  490.   SOCK_SEQPACKET = 5; // sequenced packet stream
  491.   {$EXTERNALSYM SOCK_SEQPACKET}
  492. (*
  493.  * Option flags per-socket.
  494.  *)
  495.   SO_DEBUG       = $0001; // turn on debugging info recording
  496.   {$EXTERNALSYM SO_DEBUG}
  497.   SO_ACCEPTCONN  = $0002; // socket has had listen()
  498.   {$EXTERNALSYM SO_ACCEPTCONN}
  499.   SO_REUSEADDR   = $0004; // allow local address reuse
  500.   {$EXTERNALSYM SO_REUSEADDR}
  501.   SO_KEEPALIVE   = $0008; // keep connections alive
  502.   {$EXTERNALSYM SO_KEEPALIVE}
  503.   SO_DONTROUTE   = $0010; // just use interface addresses
  504.   {$EXTERNALSYM SO_DONTROUTE}
  505.   SO_BROADCAST   = $0020; // permit sending of broadcast msgs
  506.   {$EXTERNALSYM SO_BROADCAST}
  507.   SO_USELOOPBACK = $0040; // bypass hardware when possible
  508.   {$EXTERNALSYM SO_USELOOPBACK}
  509.   SO_LINGER      = $0080; // linger on close if data present
  510.   {$EXTERNALSYM SO_LINGER}
  511.   SO_OOBINLINE   = $0100; // leave received OOB data in line
  512.   {$EXTERNALSYM SO_OOBINLINE}
  513.   SO_DONTLINGER       = DWORD(not SO_LINGER);
  514.   {$EXTERNALSYM SO_DONTLINGER}
  515. (*
  516.  * Additional options.
  517.  *)
  518.   SO_SNDBUF   = $1001; // send buffer size
  519.   {$EXTERNALSYM SO_SNDBUF}
  520.   SO_RCVBUF   = $1002; // receive buffer size
  521.   {$EXTERNALSYM SO_RCVBUF}
  522.   SO_SNDLOWAT = $1003; // send low-water mark
  523.   {$EXTERNALSYM SO_SNDLOWAT}
  524.   SO_RCVLOWAT = $1004; // receive low-water mark
  525.   {$EXTERNALSYM SO_RCVLOWAT}
  526.   SO_SNDTIMEO = $1005; // send timeout
  527.   {$EXTERNALSYM SO_SNDTIMEO}
  528.   SO_RCVTIMEO = $1006; // receive timeout
  529.   {$EXTERNALSYM SO_RCVTIMEO}
  530.   SO_ERROR    = $1007; // get error status and clear
  531.   {$EXTERNALSYM SO_ERROR}
  532.   SO_TYPE     = $1008; // get socket type
  533.   {$EXTERNALSYM SO_TYPE}
  534. (*
  535.  * Options for connect and disconnect data and options.  Used only by
  536.  * non-TCP/IP transports such as DECNet, OSI TP4, etc.
  537.  *)
  538.   SO_CONNDATA    = $7000;
  539.   {$EXTERNALSYM SO_CONNDATA}
  540.   SO_CONNOPT     = $7001;
  541.   {$EXTERNALSYM SO_CONNOPT}
  542.   SO_DISCDATA    = $7002;
  543.   {$EXTERNALSYM SO_DISCDATA}
  544.   SO_DISCOPT     = $7003;
  545.   {$EXTERNALSYM SO_DISCOPT}
  546.   SO_CONNDATALEN = $7004;
  547.   {$EXTERNALSYM SO_CONNDATALEN}
  548.   SO_CONNOPTLEN  = $7005;
  549.   {$EXTERNALSYM SO_CONNOPTLEN}
  550.   SO_DISCDATALEN = $7006;
  551.   {$EXTERNALSYM SO_DISCDATALEN}
  552.   SO_DISCOPTLEN  = $7007;
  553.   {$EXTERNALSYM SO_DISCOPTLEN}
  554. (*
  555.  * Option for opening sockets for synchronous access.
  556.  *)
  557.   SO_OPENTYPE    = $7008;
  558.   {$EXTERNALSYM SO_OPENTYPE}
  559.   SO_SYNCHRONOUS_ALERT    = $10;
  560.   {$EXTERNALSYM SO_SYNCHRONOUS_ALERT}
  561.   SO_SYNCHRONOUS_NONALERT = $20;
  562.   {$EXTERNALSYM SO_SYNCHRONOUS_NONALERT}
  563. (*
  564.  * Other NT-specific options.
  565.  *)
  566.   SO_MAXDG        = $7009;
  567.   {$EXTERNALSYM SO_MAXDG}
  568.   SO_MAXPATHDG    = $700A;
  569.   {$EXTERNALSYM SO_MAXPATHDG}
  570.   SO_UPDATE_ACCEPT_CONTEXT = $700B;
  571.   {$EXTERNALSYM SO_UPDATE_ACCEPT_CONTEXT}
  572.   SO_CONNECT_TIME = $700C;
  573.   {$EXTERNALSYM SO_CONNECT_TIME}
  574. (*
  575.  * TCP options.
  576.  *)
  577.   TCP_NODELAY = $0001;
  578.   {$EXTERNALSYM TCP_NODELAY}
  579.   TCP_BSDURGENT = $7000;
  580.   {$EXTERNALSYM TCP_BSDURGENT}
  581. (*
  582.  * Address families.
  583.  *)
  584.   AF_UNSPEC = 0; // unspecified
  585.   {$EXTERNALSYM AF_UNSPEC}
  586.   AF_UNIX      = 1; // local to host (pipes, portals
  587.   {$EXTERNALSYM AF_UNIX}
  588.   AF_INET      = 2; // internetwork: UDP, TCP, etc.
  589.   {$EXTERNALSYM AF_INET}
  590.   AF_IMPLINK   = 3; // arpanet imp addresses
  591.   {$EXTERNALSYM AF_IMPLINK}
  592.   AF_PUP       = 4; // pup protocols: e.g. BSP
  593.   {$EXTERNALSYM AF_PUP}
  594.   AF_CHAOS     = 5; // mit CHAOS protocols
  595.   {$EXTERNALSYM AF_CHAOS}
  596.   AF_NS        = 6; // XEROX NS protocols
  597.   {$EXTERNALSYM AF_NS}
  598.   AF_IPX       = AF_NS; // IPX protocols: IPX, SPX, etc.
  599.   {$EXTERNALSYM AF_IPX}
  600.   AF_ISO       = 7; // ISO protocols
  601.   {$EXTERNALSYM AF_ISO}
  602.   AF_OSI       = AF_ISO; // OSI is ISO
  603.   {$EXTERNALSYM AF_OSI}
  604.   AF_ECMA      = 8; // european computer manufacturers
  605.   {$EXTERNALSYM AF_ECMA}
  606.   AF_DATAKIT   = 9; // datakit protocols
  607.   {$EXTERNALSYM AF_DATAKIT}
  608.   AF_CCITT     = 10; // CCITT protocols, X.25 etc
  609.   {$EXTERNALSYM AF_CCITT}
  610.   AF_SNA       = 11; // IBM SNA
  611.   {$EXTERNALSYM AF_SNA}
  612.   AF_DECnet    = 12; // DECnet
  613.   {$EXTERNALSYM AF_DECnet}
  614.   AF_DLI       = 13; // Direct data link interface
  615.   {$EXTERNALSYM AF_DLI}
  616.   AF_LAT       = 14; // LAT
  617.   {$EXTERNALSYM AF_LAT}
  618.   AF_HYLINK    = 15; // NSC Hyperchannel
  619.   {$EXTERNALSYM AF_HYLINK}
  620.   AF_APPLETALK = 16; // AppleTalk
  621.   {$EXTERNALSYM AF_APPLETALK}
  622.   AF_NETBIOS   = 17; // NetBios-style addresses
  623.   {$EXTERNALSYM AF_NETBIOS}
  624.   AF_VOICEVIEW = 18; // VoiceView
  625.   {$EXTERNALSYM AF_VOICEVIEW}
  626.   AF_FIREFOX   = 19; // Protocols from Firefox
  627.   {$EXTERNALSYM AF_FIREFOX}
  628.   AF_UNKNOWN1  = 20; // Somebody is using this!
  629.   {$EXTERNALSYM AF_UNKNOWN1}
  630.   AF_BAN       = 21; // Banyan
  631.   {$EXTERNALSYM AF_BAN}
  632.   AF_MAX = 22;
  633.   {$EXTERNALSYM AF_MAX}
  634. (*
  635.  * Structure used by kernel to store most
  636.  * addresses.
  637.  *)
  638. type
  639.   sockaddr = record
  640.     sa_family: u_short;              // address family
  641.     sa_data: array [0..13] of Char;            // up to 14 bytes of direct address
  642.   end;
  643.   {$EXTERNALSYM sockaddr}
  644.   TSockAddr = sockaddr;
  645.   PSockAddr = ^sockaddr;
  646. (*
  647.  * Structure used by kernel to pass protocol
  648.  * information in raw sockets.
  649.  *)
  650.   sockproto = record
  651.     sp_family: u_short;              // address family
  652.     sp_protocol: u_short;            // protocol
  653.   end;
  654.   {$EXTERNALSYM sockproto}
  655.   TSockProto = sockproto;
  656.   PSockProto = ^sockproto;
  657. (*
  658.  * Protocol families, same as address families for now.
  659.  *)
  660. const
  661.   PF_UNSPEC    = AF_UNSPEC;
  662.   {$EXTERNALSYM PF_UNSPEC}
  663.   PF_UNIX      = AF_UNIX;
  664.   {$EXTERNALSYM PF_UNIX}
  665.   PF_INET      = AF_INET;
  666.   {$EXTERNALSYM PF_INET}
  667.   PF_IMPLINK   = AF_IMPLINK;
  668.   {$EXTERNALSYM PF_IMPLINK}
  669.   PF_PUP       = AF_PUP;
  670.   {$EXTERNALSYM PF_PUP}
  671.   PF_CHAOS     = AF_CHAOS;
  672.   {$EXTERNALSYM PF_CHAOS}
  673.   PF_NS        = AF_NS;
  674.   {$EXTERNALSYM PF_NS}
  675.   PF_IPX       = AF_IPX;
  676.   {$EXTERNALSYM PF_IPX}
  677.   PF_ISO       = AF_ISO;
  678.   {$EXTERNALSYM PF_ISO}
  679.   PF_OSI       = AF_OSI;
  680.   {$EXTERNALSYM PF_OSI}
  681.   PF_ECMA      = AF_ECMA;
  682.   {$EXTERNALSYM PF_ECMA}
  683.   PF_DATAKIT   = AF_DATAKIT;
  684.   {$EXTERNALSYM PF_DATAKIT}
  685.   PF_CCITT     = AF_CCITT;
  686.   {$EXTERNALSYM PF_CCITT}
  687.   PF_SNA       = AF_SNA;
  688.   {$EXTERNALSYM PF_SNA}
  689.   PF_DECnet    = AF_DECnet;
  690.   {$EXTERNALSYM PF_DECnet}
  691.   PF_DLI       = AF_DLI;
  692.   {$EXTERNALSYM PF_DLI}
  693.   PF_LAT       = AF_LAT;
  694.   {$EXTERNALSYM PF_LAT}
  695.   PF_HYLINK    = AF_HYLINK;
  696.   {$EXTERNALSYM PF_HYLINK}
  697.   PF_APPLETALK = AF_APPLETALK;
  698.   {$EXTERNALSYM PF_APPLETALK}
  699.   PF_VOICEVIEW = AF_VOICEVIEW;
  700.   {$EXTERNALSYM PF_VOICEVIEW}
  701.   PF_FIREFOX   = AF_FIREFOX;
  702.   {$EXTERNALSYM PF_FIREFOX}
  703.   PF_UNKNOWN1  = AF_UNKNOWN1;
  704.   {$EXTERNALSYM PF_UNKNOWN1}
  705.   PF_BAN       = AF_BAN;
  706.   {$EXTERNALSYM PF_BAN}
  707.   PF_MAX = AF_MAX;
  708.   {$EXTERNALSYM PF_MAX}
  709. (*
  710.  * Structure used for manipulating linger option.
  711.  *)
  712. type
  713.   linger = record
  714.     l_onoff: u_short;                // option on/off
  715.     l_linger: u_short;               // linger time
  716.   end;
  717.   {$EXTERNALSYM linger}
  718.   TLinger = linger;
  719.   PLinger = ^linger;
  720. (*
  721.  * Level number for (get/set)sockopt() to apply to socket itself.
  722.  *)
  723. const
  724.   SOL_SOCKET = $ffff; // options for socket level
  725.   {$EXTERNALSYM SOL_SOCKET}
  726. (*
  727.  * Maximum queue length specifiable by listen.
  728.  *)
  729.   SOMAXCONN = $7fffffff;
  730.   {$EXTERNALSYM SOMAXCONN}
  731.   MSG_OOB       = $1; // process out-of-band data
  732.   {$EXTERNALSYM MSG_OOB}
  733.   MSG_PEEK      = $2; // peek at incoming message
  734.   {$EXTERNALSYM MSG_PEEK}
  735.   MSG_DONTROUTE = $4; // send without using routing tables
  736.   {$EXTERNALSYM MSG_DONTROUTE}
  737.   MSG_MAXIOVLEN = 16;
  738.   {$EXTERNALSYM MSG_MAXIOVLEN}
  739.   MSG_PARTIAL   = $8000; // partial send or recv for message xport
  740.   {$EXTERNALSYM MSG_PARTIAL}
  741. (*
  742.  * Define constant based on rfc883, used by gethostbyxxxx() calls.
  743.  *)
  744.   MAXGETHOSTSTRUCT = 1024;
  745.   {$EXTERNALSYM MAXGETHOSTSTRUCT}
  746. (*
  747.  * Define flags to be used with the WSAAsyncSelect() call.
  748.  *)
  749.   FD_READ        = $01;
  750.   {$EXTERNALSYM FD_READ}
  751.   FD_WRITE       = $02;
  752.   {$EXTERNALSYM FD_WRITE}
  753.   FD_OOB         = $04;
  754.   {$EXTERNALSYM FD_OOB}
  755.   FD_ACCEPT      = $08;
  756.   {$EXTERNALSYM FD_ACCEPT}
  757.   FD_CONNECT     = $10;
  758.   {$EXTERNALSYM FD_CONNECT}
  759.   FD_CLOSE       = $20;
  760.   {$EXTERNALSYM FD_CLOSE}
  761. (*
  762.  * All Windows Sockets error constants are biased by WSABASEERR from
  763.  * the "normal"
  764.  *)
  765.   WSABASEERR = 10000;
  766.   {$EXTERNALSYM WSABASEERR}
  767. (*
  768.  * Windows Sockets definitions of regular Microsoft C error constants
  769.  *)
  770.   WSAEINTR  = (WSABASEERR+4);
  771.   {$EXTERNALSYM WSAEINTR}
  772.   WSAEBADF  = (WSABASEERR+9);
  773.   {$EXTERNALSYM WSAEBADF}
  774.   WSAEACCES = (WSABASEERR+13);
  775.   {$EXTERNALSYM WSAEACCES}
  776.   WSAEFAULT = (WSABASEERR+14);
  777.   {$EXTERNALSYM WSAEFAULT}
  778.   WSAEINVAL = (WSABASEERR+22);
  779.   {$EXTERNALSYM WSAEINVAL}
  780.   WSAEMFILE = (WSABASEERR+24);
  781.   {$EXTERNALSYM WSAEMFILE}
  782. (*
  783.  * Windows Sockets definitions of regular Berkeley error constants
  784.  *)
  785.   WSAEWOULDBLOCK     = (WSABASEERR+35);
  786.   {$EXTERNALSYM WSAEWOULDBLOCK}
  787.   WSAEINPROGRESS     = (WSABASEERR+36);
  788.   {$EXTERNALSYM WSAEINPROGRESS}
  789.   WSAEALREADY        = (WSABASEERR+37);
  790.   {$EXTERNALSYM WSAEALREADY}
  791.   WSAENOTSOCK        = (WSABASEERR+38);
  792.   {$EXTERNALSYM WSAENOTSOCK}
  793.   WSAEDESTADDRREQ    = (WSABASEERR+39);
  794.   {$EXTERNALSYM WSAEDESTADDRREQ}
  795.   WSAEMSGSIZE        = (WSABASEERR+40);
  796.   {$EXTERNALSYM WSAEMSGSIZE}
  797.   WSAEPROTOTYPE      = (WSABASEERR+41);
  798.   {$EXTERNALSYM WSAEPROTOTYPE}
  799.   WSAENOPROTOOPT     = (WSABASEERR+42);
  800.   {$EXTERNALSYM WSAENOPROTOOPT}
  801.   WSAEPROTONOSUPPORT = (WSABASEERR+43);
  802.   {$EXTERNALSYM WSAEPROTONOSUPPORT}
  803.   WSAESOCKTNOSUPPORT = (WSABASEERR+44);
  804.   {$EXTERNALSYM WSAESOCKTNOSUPPORT}
  805.   WSAEOPNOTSUPP      = (WSABASEERR+45);
  806.   {$EXTERNALSYM WSAEOPNOTSUPP}
  807.   WSAEPFNOSUPPORT    = (WSABASEERR+46);
  808.   {$EXTERNALSYM WSAEPFNOSUPPORT}
  809.   WSAEAFNOSUPPORT    = (WSABASEERR+47);
  810.   {$EXTERNALSYM WSAEAFNOSUPPORT}
  811.   WSAEADDRINUSE      = (WSABASEERR+48);
  812.   {$EXTERNALSYM WSAEADDRINUSE}
  813.   WSAEADDRNOTAVAIL   = (WSABASEERR+49);
  814.   {$EXTERNALSYM WSAEADDRNOTAVAIL}
  815.   WSAENETDOWN        = (WSABASEERR+50);
  816.   {$EXTERNALSYM WSAENETDOWN}
  817.   WSAENETUNREACH     = (WSABASEERR+51);
  818.   {$EXTERNALSYM WSAENETUNREACH}
  819.   WSAENETRESET       = (WSABASEERR+52);
  820.   {$EXTERNALSYM WSAENETRESET}
  821.   WSAECONNABORTED    = (WSABASEERR+53);
  822.   {$EXTERNALSYM WSAECONNABORTED}
  823.   WSAECONNRESET      = (WSABASEERR+54);
  824.   {$EXTERNALSYM WSAECONNRESET}
  825.   WSAENOBUFS         = (WSABASEERR+55);
  826.   {$EXTERNALSYM WSAENOBUFS}
  827.   WSAEISCONN         = (WSABASEERR+56);
  828.   {$EXTERNALSYM WSAEISCONN}
  829.   WSAENOTCONN        = (WSABASEERR+57);
  830.   {$EXTERNALSYM WSAENOTCONN}
  831.   WSAESHUTDOWN       = (WSABASEERR+58);
  832.   {$EXTERNALSYM WSAESHUTDOWN}
  833.   WSAETOOMANYREFS    = (WSABASEERR+59);
  834.   {$EXTERNALSYM WSAETOOMANYREFS}
  835.   WSAETIMEDOUT       = (WSABASEERR+60);
  836.   {$EXTERNALSYM WSAETIMEDOUT}
  837.   WSAECONNREFUSED    = (WSABASEERR+61);
  838.   {$EXTERNALSYM WSAECONNREFUSED}
  839.   WSAELOOP           = (WSABASEERR+62);
  840.   {$EXTERNALSYM WSAELOOP}
  841.   WSAENAMETOOLONG    = (WSABASEERR+63);
  842.   {$EXTERNALSYM WSAENAMETOOLONG}
  843.   WSAEHOSTDOWN       = (WSABASEERR+64);
  844.   {$EXTERNALSYM WSAEHOSTDOWN}
  845.   WSAEHOSTUNREACH    = (WSABASEERR+65);
  846.   {$EXTERNALSYM WSAEHOSTUNREACH}
  847.   WSAENOTEMPTY       = (WSABASEERR+66);
  848.   {$EXTERNALSYM WSAENOTEMPTY}
  849.   WSAEPROCLIM        = (WSABASEERR+67);
  850.   {$EXTERNALSYM WSAEPROCLIM}
  851.   WSAEUSERS          = (WSABASEERR+68);
  852.   {$EXTERNALSYM WSAEUSERS}
  853.   WSAEDQUOT          = (WSABASEERR+69);
  854.   {$EXTERNALSYM WSAEDQUOT}
  855.   WSAESTALE          = (WSABASEERR+70);
  856.   {$EXTERNALSYM WSAESTALE}
  857.   WSAEREMOTE         = (WSABASEERR+71);
  858.   {$EXTERNALSYM WSAEREMOTE}
  859.   WSAEDISCON         = (WSABASEERR+101);
  860.   {$EXTERNALSYM WSAEDISCON}
  861. (*
  862.  * Extended Windows Sockets error constant definitions
  863.  *)
  864.   WSASYSNOTREADY         = (WSABASEERR+91);
  865.   {$EXTERNALSYM WSASYSNOTREADY}
  866.   WSAVERNOTSUPPORTED     = (WSABASEERR+92);
  867.   {$EXTERNALSYM WSAVERNOTSUPPORTED}
  868.   WSANOTINITIALISED      = (WSABASEERR+93);
  869.   {$EXTERNALSYM WSANOTINITIALISED}
  870. (*
  871.  * Error return codes from gethostbyname() and gethostbyaddr()
  872.  * (when using the resolver). Note that these errors are
  873.  * retrieved via WSAGetLastError() and must therefore follow
  874.  * the rules for avoiding clashes with error numbers from
  875.  * specific implementations or language run-time systems.
  876.  * For this reason the codes are based at WSABASEERR+1001.
  877.  * Note also that [WSA]NO_ADDRESS is defined only for
  878.  * compatibility purposes.
  879.  *)
  880. // Authoritative Answer: Host not found
  881.   WSAHOST_NOT_FOUND = (WSABASEERR+1001);
  882.   {$EXTERNALSYM WSAHOST_NOT_FOUND}
  883. // Non-Authoritative: Host not found, or SERVERFAIL
  884.   WSATRY_AGAIN = (WSABASEERR+1002);
  885.   {$EXTERNALSYM WSATRY_AGAIN}
  886. // Non-recoverable errors, FORMERR, REFUSED, NOTIMP
  887.   WSANO_RECOVERY = (WSABASEERR+1003);
  888.   {$EXTERNALSYM WSANO_RECOVERY}
  889. // Valid name, no data record of requested type
  890.   WSANO_DATA = (WSABASEERR+1004);
  891.   {$EXTERNALSYM WSANO_DATA}
  892. (*
  893.  * Compatibility macros.
  894.  *)
  895. function h_errno: Integer;
  896. {$EXTERNALSYM h_errno}
  897. const
  898.   HOST_NOT_FOUND = WSAHOST_NOT_FOUND;
  899.   {$EXTERNALSYM HOST_NOT_FOUND}
  900.   TRY_AGAIN      = WSATRY_AGAIN;
  901.   {$EXTERNALSYM TRY_AGAIN}
  902.   NO_RECOVERY    = WSANO_RECOVERY;
  903.   {$EXTERNALSYM NO_RECOVERY}
  904.   NO_DATA        = WSANO_DATA;
  905.   {$EXTERNALSYM NO_DATA}
  906. // no address, look for MX record
  907.   WSANO_ADDRESS = WSANO_DATA;
  908.   {$EXTERNALSYM WSANO_ADDRESS}
  909.   NO_ADDRESS    = WSANO_ADDRESS;
  910.   {$EXTERNALSYM NO_ADDRESS}
  911. (*
  912.  * Windows Sockets errors redefined as regular Berkeley error constants.
  913.  * These are commented out in Windows NT to avoid conflicts with errno.h.
  914.  * Use the WSA constants instead.
  915.  *)
  916. {$IFDEF FALSE}
  917. const
  918.   EWOULDBLOCK     = WSAEWOULDBLOCK;
  919.   {$EXTERNALSYM EWOULDBLOCK}
  920.   EINPROGRESS     = WSAEINPROGRESS;
  921.   {$EXTERNALSYM EINPROGRESS}
  922.   EALREADY        = WSAEALREADY;
  923.   {$EXTERNALSYM EALREADY}
  924.   ENOTSOCK        = WSAENOTSOCK;
  925.   {$EXTERNALSYM ENOTSOCK}
  926.   EDESTADDRREQ    = WSAEDESTADDRREQ;
  927.   {$EXTERNALSYM EDESTADDRREQ}
  928.   EMSGSIZE        = WSAEMSGSIZE;
  929.   {$EXTERNALSYM EMSGSIZE}
  930.   EPROTOTYPE      = WSAEPROTOTYPE;
  931.   {$EXTERNALSYM EPROTOTYPE}
  932.   ENOPROTOOPT     = WSAENOPROTOOPT;
  933.   {$EXTERNALSYM ENOPROTOOPT}
  934.   EPROTONOSUPPORT = WSAEPROTONOSUPPORT;
  935.   {$EXTERNALSYM EPROTONOSUPPORT}
  936.   ESOCKTNOSUPPORT = WSAESOCKTNOSUPPORT;
  937.   {$EXTERNALSYM ESOCKTNOSUPPORT}
  938.   EOPNOTSUPP      = WSAEOPNOTSUPP;
  939.   {$EXTERNALSYM EOPNOTSUPP}
  940.   EPFNOSUPPORT    = WSAEPFNOSUPPORT;
  941.   {$EXTERNALSYM EPFNOSUPPORT}
  942.   EAFNOSUPPORT    = WSAEAFNOSUPPORT;
  943.   {$EXTERNALSYM EAFNOSUPPORT}
  944.   EADDRINUSE      = WSAEADDRINUSE;
  945.   {$EXTERNALSYM EADDRINUSE}
  946.   EADDRNOTAVAIL   = WSAEADDRNOTAVAIL;
  947.   {$EXTERNALSYM EADDRNOTAVAIL}
  948.   ENETDOWN        = WSAENETDOWN;
  949.   {$EXTERNALSYM ENETDOWN}
  950.   ENETUNREACH     = WSAENETUNREACH;
  951.   {$EXTERNALSYM ENETUNREACH}
  952.   ENETRESET       = WSAENETRESET;
  953.   {$EXTERNALSYM ENETRESET}
  954.   ECONNABORTED    = WSAECONNABORTED;
  955.   {$EXTERNALSYM ECONNABORTED}
  956.   ECONNRESET      = WSAECONNRESET;
  957.   {$EXTERNALSYM ECONNRESET}
  958.   ENOBUFS         = WSAENOBUFS;
  959.   {$EXTERNALSYM ENOBUFS}
  960.   EISCONN         = WSAEISCONN;
  961.   {$EXTERNALSYM EISCONN}
  962.   ENOTCONN        = WSAENOTCONN;
  963.   {$EXTERNALSYM ENOTCONN}
  964.   ESHUTDOWN       = WSAESHUTDOWN;
  965.   {$EXTERNALSYM ESHUTDOWN}
  966.   ETOOMANYREFS    = WSAETOOMANYREFS;
  967.   {$EXTERNALSYM ETOOMANYREFS}
  968.   ETIMEDOUT       = WSAETIMEDOUT;
  969.   {$EXTERNALSYM ETIMEDOUT}
  970.   ECONNREFUSED    = WSAECONNREFUSED;
  971.   {$EXTERNALSYM ECONNREFUSED}
  972.   ELOOP           = WSAELOOP;
  973.   {$EXTERNALSYM ELOOP}
  974.   ENAMETOOLONG    = WSAENAMETOOLONG;
  975.   {$EXTERNALSYM ENAMETOOLONG}
  976.   EHOSTDOWN       = WSAEHOSTDOWN;
  977.   {$EXTERNALSYM EHOSTDOWN}
  978.   EHOSTUNREACH    = WSAEHOSTUNREACH;
  979.   {$EXTERNALSYM EHOSTUNREACH}
  980.   ENOTEMPTY       = WSAENOTEMPTY;
  981.   {$EXTERNALSYM ENOTEMPTY}
  982.   EPROCLIM        = WSAEPROCLIM;
  983.   {$EXTERNALSYM EPROCLIM}
  984.   EUSERS          = WSAEUSERS;
  985.   {$EXTERNALSYM EUSERS}
  986.   EDQUOT          = WSAEDQUOT;
  987.   {$EXTERNALSYM EDQUOT}
  988.   ESTALE          = WSAESTALE;
  989.   {$EXTERNALSYM ESTALE}
  990.   EREMOTE         = WSAEREMOTE;
  991.   {$EXTERNALSYM EREMOTE}
  992. {$ENDIF}
  993. (* Socket function prototypes *)
  994. function accept(s: TSocket; addr: PSockAddr; addrlen: PINT): TSocket; stdcall;
  995. {$EXTERNALSYM accept}
  996. function bind(s: TSocket; name: PSockAddr; namelen: Integer): Integer; stdcall;
  997. {$EXTERNALSYM bind}
  998. function closesocket(s: TSocket): Integer; stdcall;
  999. {$EXTERNALSYM closesocket}
  1000. function connect(s: TSocket; name: PSockAddr; namelen: Integer): Integer; stdcall;
  1001. {$EXTERNALSYM connect}
  1002. function ioctlsocket(s: TSocket; cmd: Longint; var argp: u_long): Integer; stdcall;
  1003. {$EXTERNALSYM ioctlsocket}
  1004. function getpeername(s: TSocket; name: PSockAddr; var namelen: Integer): Integer; stdcall;
  1005. {$EXTERNALSYM getpeername}
  1006. function getsockname(s: TSocket; name: PSockAddr; var namelen: Integer): Integer; stdcall;
  1007. {$EXTERNALSYM getsockname}
  1008. function getsockopt(s: TSocket; level, optname: Integer; optval: PChar; var optlen: Integer): Integer; stdcall;
  1009. {$EXTERNALSYM getsockopt}
  1010. function htonl(hostlong: u_long): u_long; stdcall;
  1011. {$EXTERNALSYM htonl}
  1012. function htons(hostshort: u_short): u_short; stdcall;
  1013. {$EXTERNALSYM htons}
  1014. function inet_addr(cp: PChar): u_long; stdcall;
  1015. {$EXTERNALSYM inet_addr}
  1016. function inet_ntoa(inaddr: in_addr): PChar; stdcall;
  1017. {$EXTERNALSYM inet_ntoa}
  1018. function listen(s: TSocket; backlog: Integer): Integer; stdcall;
  1019. {$EXTERNALSYM listen}
  1020. function ntohl(netlong: u_long): u_long; stdcall;
  1021. {$EXTERNALSYM ntohl}
  1022. function ntohs(netshort: u_short): u_short; stdcall;
  1023. {$EXTERNALSYM ntohs}
  1024. function recv(s: TSocket; var buf; len, flags: Integer): Integer; stdcall;
  1025. {$EXTERNALSYM recv}
  1026. function recvfrom(s: TSocket; var buf; len, flags: Integer; from: PSockAddr; var fromlen: Integer): Integer; stdcall;
  1027. {$EXTERNALSYM recvfrom}
  1028. function select(nfds: Integer; readfds, writefds, exceptfds: PFdSet; timeout: PTimeVal): Integer; stdcall;
  1029. {$EXTERNALSYM select}
  1030. function send(s: TSocket; var buf; len, flags: Integer): Integer; stdcall;
  1031. {$EXTERNALSYM send}
  1032. function sendto(s: TSocket; var buf; len, flags: Integer; toaddr: PSockAddr; tolen: Integer): Integer; stdcall;
  1033. {$EXTERNALSYM sendto}
  1034. function setsockopt(s: TSocket; level, optname: Integer; optval: PChar; optlen: Integer): Integer; stdcall;
  1035. {$EXTERNALSYM setsockopt}
  1036. function shutdown(s: TSocket; how: Integer): Integer; stdcall;
  1037. {$EXTERNALSYM shutdown}
  1038. function socket(af, type_, protocol: Integer): TSocket; stdcall;
  1039. {$EXTERNALSYM socket}
  1040. (* Database function prototypes *)
  1041. function gethostbyaddr(addr: PChar; len, type_: Integer): PHostEnt; stdcall;
  1042. {$EXTERNALSYM gethostbyaddr}
  1043. function gethostbyname(name: PChar): PHostEnt; stdcall;
  1044. {$EXTERNALSYM gethostbyname}
  1045. function gethostname(name: PChar; namelen: Integer): Integer; stdcall;
  1046. {$EXTERNALSYM gethostname}
  1047. function getservbyport(port: Integer; proto: PChar): PServEnt; stdcall;
  1048. {$EXTERNALSYM getservbyport}
  1049. function getservbyname(name, proto: PChar): PServEnt; stdcall;
  1050. {$EXTERNALSYM getservbyname}
  1051. function getprotobynumber(number: Integer): PProtoEnt; stdcall;
  1052. {$EXTERNALSYM getprotobynumber}
  1053. function getprotobyname(name: PChar): PProtoEnt; stdcall;
  1054. {$EXTERNALSYM getprotobyname}
  1055. (* Microsoft Windows Extension function prototypes *)
  1056. function WSAStartup(wVersionRequired: WORD; var lpWSAData: TWSAData): Integer; stdcall;
  1057. {$EXTERNALSYM WSAStartup}
  1058. function WSACleanup: Integer; stdcall;
  1059. {$EXTERNALSYM WSACleanup}
  1060. procedure WSASetLastError(iError: Integer); stdcall;
  1061. {$EXTERNALSYM WSASetLastError}
  1062. function WSAGetLastError: Integer; stdcall;
  1063. {$EXTERNALSYM WSAGetLastError}
  1064. function WSAIsBlocking: BOOL; stdcall;
  1065. {$EXTERNALSYM WSAIsBlocking}
  1066. function WSAUnhookBlockingHook: Integer; stdcall;
  1067. {$EXTERNALSYM WSAUnhookBlockingHook}
  1068. function WSASetBlockingHook(lpBlockFunc: FARPROC): FARPROC; stdcall;
  1069. {$EXTERNALSYM WSASetBlockingHook}
  1070. function WSACancelBlockingCall: Integer; stdcall;
  1071. {$EXTERNALSYM WSACancelBlockingCall}
  1072. function WSAAsyncGetServByName(hWnd: HWND; wMsg: u_int; name, proto, buf: PChar;
  1073.   buflen: Integer): HANDLE; stdcall;
  1074. {$EXTERNALSYM WSAAsyncGetServByName}
  1075. function WSAAsyncGetServByPort(hWnd: HWND; wMsg: u_int; port: Integer;
  1076.   proto, buf: PChar; buflen: Integer): HANDLE; stdcall;
  1077. {$EXTERNALSYM WSAAsyncGetServByPort}
  1078. function WSAAsyncGetProtoByName(hWnd: HWND; wMsg: u_int; name, buf: PChar;
  1079.   buflen: Integer): HANDLE; stdcall;
  1080. {$EXTERNALSYM WSAAsyncGetProtoByName}
  1081. function WSAAsyncGetProtoByNumber(hWnd: HWND; wMsg: u_int; number: Integer;
  1082.   buf: PChar; buflen: Integer): HANDLE; stdcall;
  1083. {$EXTERNALSYM WSAAsyncGetProtoByNumber}
  1084. function WSAAsyncGetHostByName(hWnd: HWND; wMsg: u_int; name, buf: PChar;
  1085.   buflen: Integer): HANDLE; stdcall;
  1086. {$EXTERNALSYM WSAAsyncGetHostByName}
  1087. function WSAAsyncGetHostByAddr(hWnd: HWND; wMsg: u_int; addr: PChar;
  1088.   len, type_: Integer; buf: PChar; buflen: Integer): HANDLE; stdcall;
  1089. {$EXTERNALSYM WSAAsyncGetHostByAddr}
  1090. function WSACancelAsyncRequest(hAsyncTaskHandle: HANDLE): Integer; stdcall;
  1091. {$EXTERNALSYM WSACancelAsyncRequest}
  1092. function WSAAsyncSelect(s: TSocket; hWnd: HWND; wMsg: u_int; lEvent: Longint): Integer; stdcall;
  1093. {$EXTERNALSYM WSAAsyncSelect}
  1094. function WSARecvEx(s: TSocket; var buf; len: Integer; var flags: Integer): Integer; stdcall;
  1095. {$EXTERNALSYM WSARecvEx}
  1096. type
  1097.   _TRANSMIT_FILE_BUFFERS = record
  1098.     Head: LPVOID;
  1099.     HeadLength: DWORD;
  1100.     Tail: LPVOID;
  1101.     TailLength: DWORD;
  1102.   end;
  1103.   {$EXTERNALSYM _TRANSMIT_FILE_BUFFERS}
  1104.   TRANSMIT_FILE_BUFFERS = _TRANSMIT_FILE_BUFFERS;
  1105.   {$EXTERNALSYM TRANSMIT_FILE_BUFFERS}
  1106.   PTRANSMIT_FILE_BUFFERS = ^TRANSMIT_FILE_BUFFERS;
  1107.   {$EXTERNALSYM PTRANSMIT_FILE_BUFFERS}
  1108.   LPTRANSMIT_FILE_BUFFERS = ^TRANSMIT_FILE_BUFFERS;
  1109.   {$EXTERNALSYM LPTRANSMIT_FILE_BUFFERS}
  1110.   TTransmitFileBuffers = TRANSMIT_FILE_BUFFERS;
  1111.   PTransmitFileBuffers = LPTRANSMIT_FILE_BUFFERS;
  1112. const
  1113.   TF_DISCONNECT           = $01;
  1114.   {$EXTERNALSYM TF_DISCONNECT}
  1115.   TF_REUSE_SOCKET         = $02;
  1116.   {$EXTERNALSYM TF_REUSE_SOCKET}
  1117.   TF_WRITE_BEHIND         = $04;
  1118.   {$EXTERNALSYM TF_WRITE_BEHIND}
  1119. function TransmitFile(hSocket: TSocket; hFile: HANDLE; nNumberOfBytesToWrite: DWORD;
  1120.   nNumberOfBytesPerSend: DWORD; lpOverlapped: LPOVERLAPPED;
  1121.   lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS; dwReserved: DWORD): BOOL; stdcall;
  1122. {$EXTERNALSYM TransmitFile}
  1123. function AcceptEx(sListenSocket, sAcceptSocket: TSocket;
  1124.   lpOutputBuffer: LPVOID; dwReceiveDataLength, dwLocalAddressLength,
  1125.   dwRemoteAddressLength: DWORD; var lpdwBytesReceived: DWORD;
  1126.   lpOverlapped: LPOVERLAPPED): BOOL; stdcall;
  1127. {$EXTERNALSYM AcceptEx}
  1128. procedure GetAcceptExSockaddrs(lpOutputBuffer: Pointer;
  1129.   dwReceiveDataLength, dwLocalAddressLength, dwRemoteAddressLength: DWORD;
  1130.   LocalSockaddr: PSockAddr; var LocalSockaddrLength: Integer;
  1131.   RemoteSockaddr: PSockAddr; var RemoteSockaddrLength: Integer); stdcall;
  1132. {$EXTERNALSYM GetAcceptExSockaddrs}
  1133. (* Microsoft Windows Extended data types *)
  1134. type
  1135.   PSOCKADDR_IN = ^sockaddr_in;
  1136.   {$EXTERNALSYM PSOCKADDR_IN}
  1137.   LPSOCKADDR_IN = ^sockaddr_in;
  1138.   {$EXTERNALSYM LPSOCKADDR_IN}
  1139.   LPLINGER = PLINGER;
  1140.   {$EXTERNALSYM LPLINGER}
  1141.   PIN_ADDR = ^in_addr;
  1142.   {$EXTERNALSYM PIN_ADDR}
  1143.   LPIN_ADDR = ^in_addr;
  1144.   {$EXTERNALSYM LPIN_ADDR}
  1145.   PFD_SET = ^fd_set;
  1146.   {$EXTERNALSYM PFD_SET}
  1147.   LPFD_SET = ^fd_set;
  1148.   {$EXTERNALSYM LPFD_SET}
  1149.   LPHOSTENT = PHOSTENT;
  1150.   {$EXTERNALSYM LPHOSTENT}
  1151.   LPSERVENT = PSERVENT;
  1152.   {$EXTERNALSYM LPSERVENT}
  1153.   LPPROTOENT = PPROTOENT;
  1154.   {$EXTERNALSYM LPPROTOENT}
  1155.   LPTIMEVAL = PTIMEVAL;
  1156.   {$EXTERNALSYM LPTIMEVAL}
  1157. (*
  1158.  * Windows message parameter composition and decomposition
  1159.  * macros.
  1160.  *
  1161.  * WSAMAKEASYNCREPLY is intended for use by the Windows Sockets implementation
  1162.  * when constructing the response to a WSAAsyncGetXByY() routine.
  1163.  *)
  1164. function WSAMAKEASYNCREPLY(buflen, error: WORD): DWORD;
  1165. {$EXTERNALSYM WSAMAKEASYNCREPLY}
  1166. (*
  1167.  * WSAMAKESELECTREPLY is intended for use by the Windows Sockets implementation
  1168.  * when constructing the response to WSAAsyncSelect().
  1169.  *)
  1170. function WSAMAKESELECTREPLY(event, error: WORD): DWORD;
  1171. {$EXTERNALSYM WSAMAKESELECTREPLY}
  1172. (*
  1173.  * WSAGETASYNCBUFLEN is intended for use by the Windows Sockets application
  1174.  * to extract the buffer length from the lParam in the response
  1175.  * to a WSAGetXByY().
  1176.  *)
  1177. function WSAGETASYNCBUFLEN(lParam: DWORD): WORD;
  1178. {$EXTERNALSYM WSAGETASYNCBUFLEN}
  1179. (*
  1180.  * WSAGETASYNCERROR is intended for use by the Windows Sockets application
  1181.  * to extract the error code from the lParam in the response
  1182.  * to a WSAGetXByY().
  1183.  *)
  1184. function WSAGETASYNCERROR(lParam: DWORD): WORD;
  1185. {$EXTERNALSYM WSAGETASYNCERROR}
  1186. (*
  1187.  * WSAGETSELECTEVENT is intended for use by the Windows Sockets application
  1188.  * to extract the event code from the lParam in the response
  1189.  * to a WSAAsyncSelect().
  1190.  *)
  1191. function WSAGETSELECTEVENT(lParam: DWORD): WORD;
  1192. {$EXTERNALSYM WSAGETSELECTEVENT}
  1193. (*
  1194.  * WSAGETSELECTERROR is intended for use by the Windows Sockets application
  1195.  * to extract the error code from the lParam in the response
  1196.  * to a WSAAsyncSelect().
  1197.  *)
  1198. function WSAGETSELECTERROR(lParam: DWORD): WORD;
  1199. {$EXTERNALSYM WSAGETSELECTERROR}
  1200. implementation
  1201. const
  1202.   wsock32 = 'wsock32.dll';
  1203. {$IFDEF DYNAMIC_LINK}
  1204. var
  1205.   ___WSAFDIsSet: Pointer;
  1206. function __WSAFDIsSet;
  1207. begin
  1208.   GetProcedureAddress(___WSAFDIsSet, wsock32, '__WSAFDIsSet');
  1209.   asm
  1210.     mov esp, ebp
  1211.     pop ebp
  1212.     jmp [___WSAFDIsSet]
  1213.   end;
  1214. end;
  1215. {$ELSE}
  1216. function __WSAFDIsSet; external wsock32 name '__WSAFDIsSet';
  1217. {$ENDIF DYNAMIC_LINK}
  1218. procedure FD_CLR(fd: TSocket; var fdset: TFdSet);
  1219. var
  1220.   I: Cardinal;
  1221. begin
  1222.   I := 0;
  1223.   while I < fdset.fd_count do
  1224.   begin
  1225.     if fdset.fd_array[I] = fd then
  1226.     begin
  1227.       while I < fdset.fd_count - 1 do
  1228.       begin
  1229.         fdset.fd_array[I] := fdset.fd_array[I + 1];
  1230.         Inc(I);
  1231.       end;
  1232.       fdset.fd_count := fdset.fd_count - 1;
  1233.       Break;
  1234.     end;
  1235.     Inc(I);
  1236.   end;
  1237. end;
  1238. procedure _FD_SET(fd: TSocket; var fdset: TFDSet);
  1239. var
  1240.   I: Cardinal;
  1241. begin
  1242.   I := 0;
  1243.   while I < fdset.fd_count do
  1244.   begin
  1245.     if fdset.fd_array[I] = fd then Break;
  1246.     Inc(I);
  1247.   end;
  1248.   if I = fdset.fd_count then
  1249.   begin
  1250.     if fdset.fd_count < FD_SETSIZE then
  1251.     begin
  1252.       fdset.fd_array[I] := fd;
  1253.       fdset.fd_count := fdset.fd_count + 1;
  1254.     end;
  1255.   end;
  1256. end;
  1257. procedure FD_ZERO(var fdset: TFdSet);
  1258. begin
  1259.   fdset.fd_count := 0;
  1260. end;
  1261. function FD_ISSET(fd: TSocket; var fdset: TFdSet): Boolean;
  1262. begin
  1263.   Result := __WSAFDIsSet(fd, fdset) <> 0;
  1264. end;
  1265. function timerisset(const tvp: TTimeVal): Boolean;
  1266. begin
  1267.   Result := (tvp.tv_sec <> 0) or (tvp.tv_usec <> 0);
  1268. end;
  1269. procedure timerclear(var tvp: TTimeVal);
  1270. begin
  1271.   tvp.tv_sec := 0;
  1272.   tvp.tv_usec := 0;
  1273. end;
  1274. function _IO(x, y: DWORD): DWORD;
  1275. begin
  1276.   Result := IOC_VOID or (x shl 8) or y;
  1277. end;
  1278. function _IOR(x, y, t: DWORD): DWORD;
  1279. begin
  1280.   Result := IOC_OUT or ((T and IOCPARM_MASK) shl 16) or (x shl 8) or y;
  1281. end;
  1282. function _IOW(x, y, t: DWORD): DWORD;
  1283. begin
  1284.   Result := DWORD(IOC_IN or ((T and IOCPARM_MASK) shl 16) or (x shl 8) or y);
  1285. end;
  1286. function IN_CLASSA(i: DWORD): Boolean;
  1287. begin
  1288.   Result := i and DWORD($80000000) = 0;
  1289. end;
  1290. function IN_CLASSB(i: DWORD): Boolean;
  1291. begin
  1292.   Result := i and DWORD($C0000000) = DWORD($80000000);
  1293. end;
  1294. function IN_CLASSC(i: DWORD): Boolean;
  1295. begin
  1296.   Result := (i and DWORD($e0000000)) = DWORD($C0000000);
  1297. end;
  1298. function h_errno: Integer;
  1299. begin
  1300.   Result := WSAGetLastError;
  1301. end;
  1302. {$IFDEF DYNAMIC_LINK}
  1303. var
  1304.   _accept: Pointer;
  1305. function accept;
  1306. begin
  1307.   GetProcedureAddress(_accept, wsock32, 'accept');
  1308.   asm
  1309.     mov esp, ebp
  1310.     pop ebp
  1311.     jmp [_accept]
  1312.   end;
  1313. end;
  1314. {$ELSE}
  1315. function accept; external wsock32 name 'accept';
  1316. {$ENDIF DYNAMIC_LINK}
  1317. {$IFDEF DYNAMIC_LINK}
  1318. var
  1319.   _bind: Pointer;
  1320. function bind;
  1321. begin
  1322.   GetProcedureAddress(_bind, wsock32, 'bind');
  1323.   asm
  1324.     mov esp, ebp
  1325.     pop ebp
  1326.     jmp [_bind]
  1327.   end;
  1328. end;
  1329. {$ELSE}
  1330. function bind; external wsock32 name 'bind';
  1331. {$ENDIF DYNAMIC_LINK}
  1332. {$IFDEF DYNAMIC_LINK}
  1333. var
  1334.   _closesocket: Pointer;
  1335. function closesocket;
  1336. begin
  1337.   GetProcedureAddress(_closesocket, wsock32, 'closesocket');
  1338.   asm
  1339.     mov esp, ebp
  1340.     pop ebp
  1341.     jmp [_closesocket]
  1342.   end;
  1343. end;
  1344. {$ELSE}
  1345. function closesocket; external wsock32 name 'closesocket';
  1346. {$ENDIF DYNAMIC_LINK}
  1347. {$IFDEF DYNAMIC_LINK}
  1348. var
  1349.   _connect: Pointer;
  1350. function connect;
  1351. begin
  1352.   GetProcedureAddress(_connect, wsock32, 'connect');
  1353.   asm
  1354.     mov esp, ebp
  1355.     pop ebp
  1356.     jmp [_connect]
  1357.   end;
  1358. end;
  1359. {$ELSE}
  1360. function connect; external wsock32 name 'connect';
  1361. {$ENDIF DYNAMIC_LINK}
  1362. {$IFDEF DYNAMIC_LINK}
  1363. var
  1364.   _ioctlsocket: Pointer;
  1365. function ioctlsocket;
  1366. begin
  1367.   GetProcedureAddress(_ioctlsocket, wsock32, 'ioctlsocket');
  1368.   asm
  1369.     mov esp, ebp
  1370.     pop ebp
  1371.     jmp [_ioctlsocket]
  1372.   end;
  1373. end;
  1374. {$ELSE}
  1375. function ioctlsocket; external wsock32 name 'ioctlsocket';
  1376. {$ENDIF DYNAMIC_LINK}
  1377. {$IFDEF DYNAMIC_LINK}
  1378. var
  1379.   _getpeername: Pointer;
  1380. function getpeername;
  1381. begin
  1382.   GetProcedureAddress(_getpeername, wsock32, 'getpeername');
  1383.   asm
  1384.     mov esp, ebp
  1385.     pop ebp
  1386.     jmp [_getpeername]
  1387.   end;
  1388. end;
  1389. {$ELSE}
  1390. function getpeername; external wsock32 name 'getpeername';
  1391. {$ENDIF DYNAMIC_LINK}
  1392. {$IFDEF DYNAMIC_LINK}
  1393. var
  1394.   _getsockname: Pointer;
  1395. function getsockname;
  1396. begin
  1397.   GetProcedureAddress(_getsockname, wsock32, 'getsockname');
  1398.   asm
  1399.     mov esp, ebp
  1400.     pop ebp
  1401.     jmp [_getsockname]
  1402.   end;
  1403. end;
  1404. {$ELSE}
  1405. function getsockname; external wsock32 name 'getsockname';
  1406. {$ENDIF DYNAMIC_LINK}
  1407. {$IFDEF DYNAMIC_LINK}
  1408. var
  1409.   _getsockopt: Pointer;
  1410. function getsockopt;
  1411. begin
  1412.   GetProcedureAddress(_getsockopt, wsock32, 'getsockopt');
  1413.   asm
  1414.     mov esp, ebp
  1415.     pop ebp
  1416.     jmp [_getsockopt]
  1417.   end;
  1418. end;
  1419. {$ELSE}
  1420. function getsockopt; external wsock32 name 'getsockopt';
  1421. {$ENDIF DYNAMIC_LINK}
  1422. {$IFDEF DYNAMIC_LINK}
  1423. var
  1424.   _htonl: Pointer;
  1425. function htonl;
  1426. begin
  1427.   GetProcedureAddress(_htonl, wsock32, 'htonl');
  1428.   asm
  1429.     mov esp, ebp
  1430.     pop ebp
  1431.     jmp [_htonl]
  1432.   end;
  1433. end;
  1434. {$ELSE}
  1435. function htonl; external wsock32 name 'htonl';
  1436. {$ENDIF DYNAMIC_LINK}
  1437. {$IFDEF DYNAMIC_LINK}
  1438. var
  1439.   _htons: Pointer;
  1440. function htons;
  1441. begin
  1442.   GetProcedureAddress(_htons, wsock32, 'htons');
  1443.   asm
  1444.     mov esp, ebp
  1445.     pop ebp
  1446.     jmp [_htons]
  1447.   end;
  1448. end;
  1449. {$ELSE}
  1450. function htons; external wsock32 name 'htons';
  1451. {$ENDIF DYNAMIC_LINK}
  1452. {$IFDEF DYNAMIC_LINK}
  1453. var
  1454.   _inet_addr: Pointer;
  1455. function inet_addr;
  1456. begin
  1457.   GetProcedureAddress(_inet_addr, wsock32, 'inet_addr');
  1458.   asm
  1459.     mov esp, ebp
  1460.     pop ebp
  1461.     jmp [_inet_addr]
  1462.   end;
  1463. end;
  1464. {$ELSE}
  1465. function inet_addr; external wsock32 name 'inet_addr';
  1466. {$ENDIF DYNAMIC_LINK}
  1467. {$IFDEF DYNAMIC_LINK}
  1468. var
  1469.   _inet_ntoa: Pointer;
  1470. function inet_ntoa;
  1471. begin
  1472.   GetProcedureAddress(_inet_ntoa, wsock32, 'inet_ntoa');
  1473.   asm
  1474.     mov esp, ebp
  1475.     pop ebp
  1476.     jmp [_inet_ntoa]
  1477.   end;
  1478. end;
  1479. {$ELSE}
  1480. function inet_ntoa; external wsock32 name 'inet_ntoa';
  1481. {$ENDIF DYNAMIC_LINK}
  1482. {$IFDEF DYNAMIC_LINK}
  1483. var
  1484.   _listen: Pointer;
  1485. function listen;
  1486. begin
  1487.   GetProcedureAddress(_listen, wsock32, 'listen');
  1488.   asm
  1489.     mov esp, ebp
  1490.     pop ebp
  1491.     jmp [_listen]
  1492.   end;
  1493. end;
  1494. {$ELSE}
  1495. function listen; external wsock32 name 'listen';
  1496. {$ENDIF DYNAMIC_LINK}
  1497. {$IFDEF DYNAMIC_LINK}
  1498. var
  1499.   _ntohl: Pointer;
  1500. function ntohl;
  1501. begin
  1502.   GetProcedureAddress(_ntohl, wsock32, 'ntohl');
  1503.   asm
  1504.     mov esp, ebp
  1505.     pop ebp
  1506.     jmp [_ntohl]
  1507.   end;
  1508. end;
  1509. {$ELSE}
  1510. function ntohl; external wsock32 name 'ntohl';
  1511. {$ENDIF DYNAMIC_LINK}
  1512. {$IFDEF DYNAMIC_LINK}
  1513. var
  1514.   _ntohs: Pointer;
  1515. function ntohs;
  1516. begin
  1517.   GetProcedureAddress(_ntohs, wsock32, 'ntohs');
  1518.   asm
  1519.     mov esp, ebp
  1520.     pop ebp
  1521.     jmp [_ntohs]
  1522.   end;
  1523. end;
  1524. {$ELSE}
  1525. function ntohs; external wsock32 name 'ntohs';
  1526. {$ENDIF DYNAMIC_LINK}
  1527. {$IFDEF DYNAMIC_LINK}
  1528. var
  1529.   _recv: Pointer;
  1530. function recv;
  1531. begin
  1532.   GetProcedureAddress(_recv, wsock32, 'recv');
  1533.   asm
  1534.     mov esp, ebp
  1535.     pop ebp
  1536.     jmp [_recv]
  1537.   end;
  1538. end;
  1539. {$ELSE}
  1540. function recv; external wsock32 name 'recv';
  1541. {$ENDIF DYNAMIC_LINK}
  1542. {$IFDEF DYNAMIC_LINK}
  1543. var
  1544.   _recvfrom: Pointer;
  1545. function recvfrom;
  1546. begin
  1547.   GetProcedureAddress(_recvfrom, wsock32, 'recvfrom');
  1548.   asm
  1549.     mov esp, ebp
  1550.     pop ebp
  1551.     jmp [_recvfrom]
  1552.   end;
  1553. end;
  1554. {$ELSE}
  1555. function recvfrom; external wsock32 name 'recvfrom';
  1556. {$ENDIF DYNAMIC_LINK}
  1557. {$IFDEF DYNAMIC_LINK}
  1558. var
  1559.   _select: Pointer;
  1560. function select;
  1561. begin
  1562.   GetProcedureAddress(_select, wsock32, 'select');
  1563.   asm
  1564.     mov esp, ebp
  1565.     pop ebp
  1566.     jmp [_select]
  1567.   end;
  1568. end;
  1569. {$ELSE}
  1570. function select; external wsock32 name 'select';
  1571. {$ENDIF DYNAMIC_LINK}
  1572. {$IFDEF DYNAMIC_LINK}
  1573. var
  1574.   _send: Pointer;
  1575. function send;
  1576. begin
  1577.   GetProcedureAddress(_send, wsock32, 'send');
  1578.   asm
  1579.     mov esp, ebp
  1580.     pop ebp
  1581.     jmp [_send]
  1582.   end;
  1583. end;
  1584. {$ELSE}
  1585. function send; external wsock32 name 'send';
  1586. {$ENDIF DYNAMIC_LINK}
  1587. {$IFDEF DYNAMIC_LINK}
  1588. var
  1589.   _sendto: Pointer;
  1590. function sendto;
  1591. begin
  1592.   GetProcedureAddress(_sendto, wsock32, 'sendto');
  1593.   asm
  1594.     mov esp, ebp
  1595.     pop ebp
  1596.     jmp [_sendto]
  1597.   end;
  1598. end;
  1599. {$ELSE}
  1600. function sendto; external wsock32 name 'sendto';
  1601. {$ENDIF DYNAMIC_LINK}
  1602. {$IFDEF DYNAMIC_LINK}
  1603. var
  1604.   _setsockopt: Pointer;
  1605. function setsockopt;
  1606. begin
  1607.   GetProcedureAddress(_setsockopt, wsock32, 'setsockopt');
  1608.   asm
  1609.     mov esp, ebp
  1610.     pop ebp
  1611.     jmp [_setsockopt]
  1612.   end;
  1613. end;
  1614. {$ELSE}
  1615. function setsockopt; external wsock32 name 'setsockopt';
  1616. {$ENDIF DYNAMIC_LINK}
  1617. {$IFDEF DYNAMIC_LINK}
  1618. var
  1619.   _shutdown: Pointer;
  1620. function shutdown;
  1621. begin
  1622.   GetProcedureAddress(_shutdown, wsock32, 'shutdown');
  1623.   asm
  1624.     mov esp, ebp
  1625.     pop ebp
  1626.     jmp [_shutdown]
  1627.   end;
  1628. end;
  1629. {$ELSE}
  1630. function shutdown; external wsock32 name 'shutdown';
  1631. {$ENDIF DYNAMIC_LINK}
  1632. {$IFDEF DYNAMIC_LINK}
  1633. var
  1634.   _socket: Pointer;
  1635. function socket;
  1636. begin
  1637.   GetProcedureAddress(_socket, wsock32, 'socket');
  1638.   asm
  1639.     mov esp, ebp
  1640.     pop ebp
  1641.     jmp [_socket]
  1642.   end;
  1643. end;
  1644. {$ELSE}
  1645. function socket; external wsock32 name 'socket';
  1646. {$ENDIF DYNAMIC_LINK}
  1647. {$IFDEF DYNAMIC_LINK}
  1648. var
  1649.   _gethostbyaddr: Pointer;
  1650. function gethostbyaddr;
  1651. begin
  1652.   GetProcedureAddress(_gethostbyaddr, wsock32, 'gethostbyaddr');
  1653.   asm
  1654.     mov esp, ebp
  1655.     pop ebp
  1656.     jmp [_gethostbyaddr]
  1657.   end;
  1658. end;
  1659. {$ELSE}
  1660. function gethostbyaddr; external wsock32 name 'gethostbyaddr';
  1661. {$ENDIF DYNAMIC_LINK}
  1662. {$IFDEF DYNAMIC_LINK}
  1663. var
  1664.   _gethostbyname: Pointer;
  1665. function gethostbyname;
  1666. begin
  1667.   GetProcedureAddress(_gethostbyname, wsock32, 'gethostbyname');
  1668.   asm
  1669.     mov esp, ebp
  1670.     pop ebp
  1671.     jmp [_gethostbyname]
  1672.   end;
  1673. end;
  1674. {$ELSE}
  1675. function gethostbyname; external wsock32 name 'gethostbyname';
  1676. {$ENDIF DYNAMIC_LINK}
  1677. {$IFDEF DYNAMIC_LINK}
  1678. var
  1679.   _gethostname: Pointer;
  1680. function gethostname;
  1681. begin
  1682.   GetProcedureAddress(_gethostname, wsock32, 'gethostname');
  1683.   asm
  1684.     mov esp, ebp
  1685.     pop ebp
  1686.     jmp [_gethostname]
  1687.   end;
  1688. end;
  1689. {$ELSE}
  1690. function gethostname; external wsock32 name 'gethostname';
  1691. {$ENDIF DYNAMIC_LINK}
  1692. {$IFDEF DYNAMIC_LINK}
  1693. var
  1694.   _getservbyport: Pointer;
  1695. function getservbyport;
  1696. begin
  1697.   GetProcedureAddress(_getservbyport, wsock32, 'getservbyport');
  1698.   asm
  1699.     mov esp, ebp
  1700.     pop ebp
  1701.     jmp [_getservbyport]
  1702.   end;
  1703. end;
  1704. {$ELSE}
  1705. function getservbyport; external wsock32 name 'getservbyport';
  1706. {$ENDIF DYNAMIC_LINK}
  1707. {$IFDEF DYNAMIC_LINK}
  1708. var
  1709.   _getservbyname: Pointer;
  1710. function getservbyname;
  1711. begin
  1712.   GetProcedureAddress(_getservbyname, wsock32, 'getservbyname');
  1713.   asm
  1714.     mov esp, ebp
  1715.     pop ebp
  1716.     jmp [_getservbyname]
  1717.   end;
  1718. end;
  1719. {$ELSE}
  1720. function getservbyname; external wsock32 name 'getservbyname';
  1721. {$ENDIF DYNAMIC_LINK}
  1722. {$IFDEF DYNAMIC_LINK}
  1723. var
  1724.   _getprotobynumber: Pointer;
  1725. function getprotobynumber;
  1726. begin
  1727.   GetProcedureAddress(_getprotobynumber, wsock32, 'getprotobynumber');
  1728.   asm
  1729.     mov esp, ebp
  1730.     pop ebp
  1731.     jmp [_getprotobynumber]
  1732.   end;
  1733. end;
  1734. {$ELSE}
  1735. function getprotobynumber; external wsock32 name 'getprotobynumber';
  1736. {$ENDIF DYNAMIC_LINK}
  1737. {$IFDEF DYNAMIC_LINK}
  1738. var
  1739.   _getprotobyname: Pointer;
  1740. function getprotobyname;
  1741. begin
  1742.   GetProcedureAddress(_getprotobyname, wsock32, 'getprotobyname');
  1743.   asm
  1744.     mov esp, ebp
  1745.     pop ebp
  1746.     jmp [_getprotobyname]
  1747.   end;
  1748. end;
  1749. {$ELSE}
  1750. function getprotobyname; external wsock32 name 'getprotobyname';
  1751. {$ENDIF DYNAMIC_LINK}
  1752. {$IFDEF DYNAMIC_LINK}
  1753. var
  1754.   _WSAStartup: Pointer;
  1755. function WSAStartup;
  1756. begin
  1757.   GetProcedureAddress(_WSAStartup, wsock32, 'WSAStartup');
  1758.   asm
  1759.     mov esp, ebp
  1760.     pop ebp
  1761.     jmp [_WSAStartup]
  1762.   end;
  1763. end;
  1764. {$ELSE}
  1765. function WSAStartup; external wsock32 name 'WSAStartup';
  1766. {$ENDIF DYNAMIC_LINK}
  1767. {$IFDEF DYNAMIC_LINK}
  1768. var
  1769.   _WSACleanup: Pointer;
  1770. function WSACleanup;
  1771. begin
  1772.   GetProcedureAddress(_WSACleanup, wsock32, 'WSACleanup');
  1773.   asm
  1774.     mov esp, ebp
  1775.     pop ebp
  1776.     jmp [_WSACleanup]
  1777.   end;
  1778. end;
  1779. {$ELSE}
  1780. function WSACleanup; external wsock32 name 'WSACleanup';
  1781. {$ENDIF DYNAMIC_LINK}
  1782. {$IFDEF DYNAMIC_LINK}
  1783. var
  1784.   _WSASetLastError: Pointer;
  1785. procedure WSASetLastError;
  1786. begin
  1787.   GetProcedureAddress(_WSASetLastError, wsock32, 'WSASetLastError');
  1788.   asm
  1789.     mov esp, ebp
  1790.     pop ebp
  1791.     jmp [_WSASetLastError]
  1792.   end;
  1793. end;
  1794. {$ELSE}
  1795. procedure WSASetLastError; external wsock32 name 'WSASetLastError';
  1796. {$ENDIF DYNAMIC_LINK}
  1797. {$IFDEF DYNAMIC_LINK}
  1798. var
  1799.   _WSAGetLastError: Pointer;
  1800. function WSAGetLastError;
  1801. begin
  1802.   GetProcedureAddress(_WSAGetLastError, wsock32, 'WSAGetLastError');
  1803.   asm
  1804.     mov esp, ebp
  1805.     pop ebp
  1806.     jmp [_WSAGetLastError]
  1807.   end;
  1808. end;
  1809. {$ELSE}
  1810. function WSAGetLastError; external wsock32 name 'WSAGetLastError';
  1811. {$ENDIF DYNAMIC_LINK}
  1812. {$IFDEF DYNAMIC_LINK}
  1813. var
  1814.   _WSAIsBlocking: Pointer;
  1815. function WSAIsBlocking;
  1816. begin
  1817.   GetProcedureAddress(_WSAIsBlocking, wsock32, 'WSAIsBlocking');
  1818.   asm
  1819.     mov esp, ebp
  1820.     pop ebp
  1821.     jmp [_WSAIsBlocking]
  1822.   end;
  1823. end;
  1824. {$ELSE}
  1825. function WSAIsBlocking; external wsock32 name 'WSAIsBlocking';
  1826. {$ENDIF DYNAMIC_LINK}
  1827. {$IFDEF DYNAMIC_LINK}
  1828. var
  1829.   _WSAUnhookBlockingHook: Pointer;
  1830. function WSAUnhookBlockingHook;
  1831. begin
  1832.   GetProcedureAddress(_WSAUnhookBlockingHook, wsock32, 'WSAUnhookBlockingHook');
  1833.   asm
  1834.     mov esp, ebp
  1835.     pop ebp
  1836.     jmp [_WSAUnhookBlockingHook]
  1837.   end;
  1838. end;
  1839. {$ELSE}
  1840. function WSAUnhookBlockingHook; external wsock32 name 'WSAUnhookBlockingHook';
  1841. {$ENDIF DYNAMIC_LINK}
  1842. {$IFDEF DYNAMIC_LINK}
  1843. var
  1844.   _WSASetBlockingHook: Pointer;
  1845. function WSASetBlockingHook;
  1846. begin
  1847.   GetProcedureAddress(_WSASetBlockingHook, wsock32, 'WSASetBlockingHook');
  1848.   asm
  1849.     mov esp, ebp
  1850.     pop ebp
  1851.     jmp [_WSASetBlockingHook]
  1852.   end;
  1853. end;
  1854. {$ELSE}
  1855. function WSASetBlockingHook; external wsock32 name 'WSASetBlockingHook';
  1856. {$ENDIF DYNAMIC_LINK}
  1857. {$IFDEF DYNAMIC_LINK}
  1858. var
  1859.   _WSACancelBlockingCall: Pointer;
  1860. function WSACancelBlockingCall;
  1861. begin
  1862.   GetProcedureAddress(_WSACancelBlockingCall, wsock32, 'WSACancelBlockingCall');
  1863.   asm
  1864.     mov esp, ebp
  1865.     pop ebp
  1866.     jmp [_WSACancelBlockingCall]
  1867.   end;
  1868. end;
  1869. {$ELSE}
  1870. function WSACancelBlockingCall; external wsock32 name 'WSACancelBlockingCall';
  1871. {$ENDIF DYNAMIC_LINK}
  1872. {$IFDEF DYNAMIC_LINK}
  1873. var
  1874.   _WSAAsyncGetServByName: Pointer;
  1875. function WSAAsyncGetServByName;
  1876. begin
  1877.   GetProcedureAddress(_WSAAsyncGetServByName, wsock32, 'WSAAsyncGetServByName');
  1878.   asm
  1879.     mov esp, ebp
  1880.     pop ebp
  1881.     jmp [_WSAAsyncGetServByName]
  1882.   end;
  1883. end;
  1884. {$ELSE}
  1885. function WSAAsyncGetServByName; external wsock32 name 'WSAAsyncGetServByName';
  1886. {$ENDIF DYNAMIC_LINK}
  1887. {$IFDEF DYNAMIC_LINK}
  1888. var
  1889.   _WSAAsyncGetServByPort: Pointer;
  1890. function WSAAsyncGetServByPort;
  1891. begin
  1892.   GetProcedureAddress(_WSAAsyncGetServByPort, wsock32, 'WSAAsyncGetServByPort');
  1893.   asm
  1894.     mov esp, ebp
  1895.     pop ebp
  1896.     jmp [_WSAAsyncGetServByPort]
  1897.   end;
  1898. end;
  1899. {$ELSE}
  1900. function WSAAsyncGetServByPort; external wsock32 name 'WSAAsyncGetServByPort';
  1901. {$ENDIF DYNAMIC_LINK}
  1902. {$IFDEF DYNAMIC_LINK}
  1903. var
  1904.   _WSAAsyncGetProtoByName: Pointer;
  1905. function WSAAsyncGetProtoByName;
  1906. begin
  1907.   GetProcedureAddress(_WSAAsyncGetProtoByName, wsock32, 'WSAAsyncGetProtoByName');
  1908.   asm
  1909.     mov esp, ebp
  1910.     pop ebp
  1911.     jmp [_WSAAsyncGetProtoByName]
  1912.   end;
  1913. end;
  1914. {$ELSE}
  1915. function WSAAsyncGetProtoByName; external wsock32 name 'WSAAsyncGetProtoByName';
  1916. {$ENDIF DYNAMIC_LINK}
  1917. {$IFDEF DYNAMIC_LINK}
  1918. var
  1919.   _WSAAsyncGetProtoByNumber: Pointer;
  1920. function WSAAsyncGetProtoByNumber;
  1921. begin
  1922.   GetProcedureAddress(_WSAAsyncGetProtoByNumber, wsock32, 'WSAAsyncGetProtoByNumber');
  1923.   asm
  1924.     mov esp, ebp
  1925.     pop ebp
  1926.     jmp [_WSAAsyncGetProtoByNumber]
  1927.   end;
  1928. end;
  1929. {$ELSE}
  1930. function WSAAsyncGetProtoByNumber; external wsock32 name 'WSAAsyncGetProtoByNumber';
  1931. {$ENDIF DYNAMIC_LINK}
  1932. {$IFDEF DYNAMIC_LINK}
  1933. var
  1934.   _WSAAsyncGetHostByName: Pointer;
  1935. function WSAAsyncGetHostByName;
  1936. begin
  1937.   GetProcedureAddress(_WSAAsyncGetHostByName, wsock32, 'WSAAsyncGetHostByName');
  1938.   asm
  1939.     mov esp, ebp
  1940.     pop ebp
  1941.     jmp [_WSAAsyncGetHostByName]
  1942.   end;
  1943. end;
  1944. {$ELSE}
  1945. function WSAAsyncGetHostByName; external wsock32 name 'WSAAsyncGetHostByName';
  1946. {$ENDIF DYNAMIC_LINK}
  1947. {$IFDEF DYNAMIC_LINK}
  1948. var
  1949.   _WSAAsyncGetHostByAddr: Pointer;
  1950. function WSAAsyncGetHostByAddr;
  1951. begin
  1952.   GetProcedureAddress(_WSAAsyncGetHostByAddr, wsock32, 'WSAAsyncGetHostByAddr');
  1953.   asm
  1954.     mov esp, ebp
  1955.     pop ebp
  1956.     jmp [_WSAAsyncGetHostByAddr]
  1957.   end;
  1958. end;
  1959. {$ELSE}
  1960. function WSAAsyncGetHostByAddr; external wsock32 name 'WSAAsyncGetHostByAddr';
  1961. {$ENDIF DYNAMIC_LINK}
  1962. {$IFDEF DYNAMIC_LINK}
  1963. var
  1964.   _WSACancelAsyncRequest: Pointer;
  1965. function WSACancelAsyncRequest;
  1966. begin
  1967.   GetProcedureAddress(_WSACancelAsyncRequest, wsock32, 'WSACancelAsyncRequest');
  1968.   asm
  1969.     mov esp, ebp
  1970.     pop ebp
  1971.     jmp [_WSACancelAsyncRequest]
  1972.   end;
  1973. end;
  1974. {$ELSE}
  1975. function WSACancelAsyncRequest; external wsock32 name 'WSACancelAsyncRequest';
  1976. {$ENDIF DYNAMIC_LINK}
  1977. {$IFDEF DYNAMIC_LINK}
  1978. var
  1979.   _WSAAsyncSelect: Pointer;
  1980. function WSAAsyncSelect;
  1981. begin
  1982.   GetProcedureAddress(_WSAAsyncSelect, wsock32, 'WSAAsyncSelect');
  1983.   asm
  1984.     mov esp, ebp
  1985.     pop ebp
  1986.     jmp [_WSAAsyncSelect]
  1987.   end;
  1988. end;
  1989. {$ELSE}
  1990. function WSAAsyncSelect; external wsock32 name 'WSAAsyncSelect';
  1991. {$ENDIF DYNAMIC_LINK}
  1992. {$IFDEF DYNAMIC_LINK}
  1993. var
  1994.   _WSARecvEx: Pointer;
  1995. function WSARecvEx;
  1996. begin
  1997.   GetProcedureAddress(_WSARecvEx, wsock32, 'WSARecvEx');
  1998.   asm
  1999.     mov esp, ebp
  2000.     pop ebp
  2001.     jmp [_WSARecvEx]
  2002.   end;
  2003. end;
  2004. {$ELSE}
  2005. function WSARecvEx; external wsock32 name 'WSARecvEx';
  2006. {$ENDIF DYNAMIC_LINK}
  2007. {$IFDEF DYNAMIC_LINK}
  2008. var
  2009.   _TransmitFile: Pointer;
  2010. function TransmitFile;
  2011. begin
  2012.   GetProcedureAddress(_TransmitFile, wsock32, 'TransmitFile');
  2013.   asm
  2014.     mov esp, ebp
  2015.     pop ebp
  2016.     jmp [_TransmitFile]
  2017.   end;
  2018. end;
  2019. {$ELSE}
  2020. function TransmitFile; external wsock32 name 'TransmitFile';
  2021. {$ENDIF DYNAMIC_LINK}
  2022. {$IFDEF DYNAMIC_LINK}
  2023. var
  2024.   _AcceptEx: Pointer;
  2025. function AcceptEx;
  2026. begin
  2027.   GetProcedureAddress(_AcceptEx, wsock32, 'AcceptEx');
  2028.   asm
  2029.     mov esp, ebp
  2030.     pop ebp
  2031.     jmp [_AcceptEx]
  2032.   end;
  2033. end;
  2034. {$ELSE}
  2035. function AcceptEx; external wsock32 name 'AcceptEx';
  2036. {$ENDIF DYNAMIC_LINK}
  2037. {$IFDEF DYNAMIC_LINK}
  2038. var
  2039.   _GetAcceptExSockaddrs: Pointer;
  2040. procedure GetAcceptExSockaddrs;
  2041. begin
  2042.   GetProcedureAddress(_GetAcceptExSockaddrs, wsock32, 'GetAcceptExSockaddrs');
  2043.   asm
  2044.     mov esp, ebp
  2045.     pop ebp
  2046.     jmp [_GetAcceptExSockaddrs]
  2047.   end;
  2048. end;
  2049. {$ELSE}
  2050. procedure GetAcceptExSockaddrs; external wsock32 name 'GetAcceptExSockaddrs';
  2051. {$ENDIF DYNAMIC_LINK}
  2052. function WSAMAKEASYNCREPLY(buflen, error: WORD): DWORD;
  2053. begin
  2054.   Result := MAKELONG(buflen, error);
  2055. end;
  2056. function WSAMAKESELECTREPLY(event, error: WORD): DWORD;
  2057. begin
  2058.   Result := MAKELONG(event, error);
  2059. end;
  2060. function WSAGETASYNCBUFLEN(lParam: DWORD): WORD;
  2061. begin
  2062.   Result := LOWORD(lParam);
  2063. end;
  2064. function WSAGETASYNCERROR(lParam: DWORD): WORD;
  2065. begin
  2066.   Result := HIWORD(lParam);
  2067. end;
  2068. function WSAGETSELECTEVENT(lParam: DWORD): WORD;
  2069. begin
  2070.   Result := LOWORD(lParam);
  2071. end;
  2072. function WSAGETSELECTERROR(lParam: DWORD): WORD;
  2073. begin
  2074.   Result := HIWORD(lParam);
  2075. end;
  2076. end.