mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 13:20:19 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			964 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			964 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
{
 | 
						|
    $Id$
 | 
						|
    This file is part of the Free Pascal run time library.
 | 
						|
    This unit contains the declarations for the Win32 Socket Library
 | 
						|
 | 
						|
    Copyright (c) 1999-2000 by Florian Klaempfl,
 | 
						|
    member of the Free Pascal development team.
 | 
						|
 | 
						|
    See the file COPYING.FPC, included in this distribution,
 | 
						|
    for details about the copyright.
 | 
						|
 | 
						|
    This program is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | 
						|
 | 
						|
 **********************************************************************}
 | 
						|
 | 
						|
{$PACKRECORDS 1}
 | 
						|
unit winsock;
 | 
						|
{$ifndef VER0_99_14}
 | 
						|
{$ifndef NO_SMART_LINK}
 | 
						|
{$define support_smartlink}
 | 
						|
{$endif}
 | 
						|
{$endif}
 | 
						|
 | 
						|
 | 
						|
{$ifdef support_smartlink}
 | 
						|
{$smartlink on}
 | 
						|
{$endif}
 | 
						|
 | 
						|
 | 
						|
  interface
 | 
						|
 | 
						|
    uses
 | 
						|
       os_types,
 | 
						|
       windows;
 | 
						|
 | 
						|
    const
 | 
						|
       {
 | 
						|
         Default maximium number of sockets.
 | 
						|
         this does not
 | 
						|
         mean that the underlying Windows Sockets implementation has to
 | 
						|
         support that many!
 | 
						|
       }
 | 
						|
       FD_SETSIZE = 64;
 | 
						|
 | 
						|
    type
 | 
						|
       u_char = char;
 | 
						|
       u_short = word;
 | 
						|
       u_int = tOS_UINT;
 | 
						|
       u_long = dword;
 | 
						|
       pu_long = ^u_long;
 | 
						|
       plongint = ^longint;
 | 
						|
       TSocket = u_long;
 | 
						|
 | 
						|
       { there is already a procedure called FD_SET, so this
 | 
						|
         record was renamed (FK) }
 | 
						|
       fdset = record
 | 
						|
          fd_count : u_int;
 | 
						|
          fd_array : array[0..(FD_SETSIZE)-1] of TSocket;
 | 
						|
       end;
 | 
						|
 | 
						|
       TFDSet = fdset;
 | 
						|
       PFDSet = ^fdset;
 | 
						|
 | 
						|
       timeval = record
 | 
						|
          tv_sec : longint;
 | 
						|
          tv_usec : longint;
 | 
						|
       end;
 | 
						|
 | 
						|
       TTimeVal = timeval;
 | 
						|
       PTimeVal = ^TTimeVal;
 | 
						|
 | 
						|
       { found no reference to this type in c header files and here. AlexS }
 | 
						|
       { minutes west of Greenwich  }
 | 
						|
       { type of dst correction  }
 | 
						|
       timezone = record
 | 
						|
          tz_minuteswest : longint;
 | 
						|
          tz_dsttime : longint;
 | 
						|
       end;
 | 
						|
       TTimeZone = timezone;
 | 
						|
       PTimeZone = ^TTimeZone;
 | 
						|
 | 
						|
    const
 | 
						|
       IOCPARM_MASK = $7f;
 | 
						|
       IOC_VOID = $20000000;
 | 
						|
       IOC_OUT = $40000000;
 | 
						|
       IOC_IN = $80000000;
 | 
						|
       IOC_INOUT = IOC_IN or IOC_OUT;
 | 
						|
       FIONREAD = IOC_OUT or
 | 
						|
         ((4 and IOCPARM_MASK) shl 16) or
 | 
						|
         (102 shl 8) or 127;
 | 
						|
       FIONBIO = IOC_IN or
 | 
						|
         ((4 and IOCPARM_MASK) shl 16) or
 | 
						|
         (102 shl 8) or 126;
 | 
						|
       FIOASYNC     = IOC_IN or
 | 
						|
         ((4 and IOCPARM_MASK) shl 16) or
 | 
						|
         (102 shl 8) or 125;
 | 
						|
       {
 | 
						|
         Structures returned by network data base library, taken from the
 | 
						|
         BSD file netdb.h.  All addresses are supplied in host order, and
 | 
						|
         returned in network order (suitable for use in system calls).
 | 
						|
         Slight modifications for differences between Linux and winsock.h
 | 
						|
      }
 | 
						|
    type
 | 
						|
       hostent = record
 | 
						|
          { official name of host  }
 | 
						|
          h_name: pchar;
 | 
						|
          { alias list  }
 | 
						|
          h_aliases: ^pchar;
 | 
						|
          { host address type  }
 | 
						|
          h_addrtype: SmallInt;
 | 
						|
          { length of address  }
 | 
						|
          h_length: SmallInt;
 | 
						|
          { list of addresses  }
 | 
						|
          case byte of
 | 
						|
             0: (h_addr_list: ^pchar);
 | 
						|
             1: (h_addr: ^pchar)
 | 
						|
       end;
 | 
						|
       THostEnt = hostent;
 | 
						|
       PHostEnt = ^THostEnt;
 | 
						|
 | 
						|
       {
 | 
						|
         Assumption here is that a network number
 | 
						|
         fits in an unsigned long -- someday that won't be true!
 | 
						|
       }
 | 
						|
       netent = record
 | 
						|
          { official name of net  }
 | 
						|
          n_name : ^char;
 | 
						|
          { alias list  }
 | 
						|
          n_aliases : ^pchar;
 | 
						|
          { net address type  }
 | 
						|
          n_addrtype : SmallInt;
 | 
						|
          n_pad1 : SmallInt;    { ensure right packaging }
 | 
						|
          { network #  }
 | 
						|
          n_net : u_long;
 | 
						|
       end;
 | 
						|
       TNetEnt = netent;
 | 
						|
       PNetEnt = ^TNetEnt;
 | 
						|
 | 
						|
       servent = record
 | 
						|
          { official service name  }
 | 
						|
          s_name : ^char;
 | 
						|
          { alias list  }
 | 
						|
          s_aliases : ^pchar;
 | 
						|
          { port #  }
 | 
						|
          s_port : SmallInt;
 | 
						|
          n_pad1 : SmallInt;    { ensure right packaging }
 | 
						|
          { protocol to use  }
 | 
						|
          s_proto : ^char;
 | 
						|
       end;
 | 
						|
       TServEnt = servent;
 | 
						|
       PServEnt = ^TServEnt;
 | 
						|
 | 
						|
       protoent = record
 | 
						|
          { official protocol name  }
 | 
						|
          p_name : ^char;
 | 
						|
          { alias list  }
 | 
						|
          p_aliases : ^pchar;
 | 
						|
          { protocol #  }
 | 
						|
          p_proto : SmallInt;
 | 
						|
          p_pad1 : SmallInt;    { ensure packaging }
 | 
						|
       end;
 | 
						|
       TProtoEnt = protoent;
 | 
						|
       PProtoEnt = ^TProtoEnt;
 | 
						|
 | 
						|
    const
 | 
						|
       {
 | 
						|
         Standard well-known IP protocols.
 | 
						|
         For some reason there are differences between Linx and winsock.h
 | 
						|
       }
 | 
						|
       IPPROTO_IP = 0;
 | 
						|
       IPPROTO_ICMP = 1;
 | 
						|
       IPPROTO_IGMP = 2;
 | 
						|
       IPPROTO_GGP = 3;
 | 
						|
       IPPROTO_TCP = 6;
 | 
						|
       IPPORT_ECHO = 7;
 | 
						|
       IPPORT_DISCARD = 9;
 | 
						|
       IPPORT_SYSTAT = 11;
 | 
						|
       IPPROTO_PUP = 12;
 | 
						|
       IPPORT_DAYTIME = 13;
 | 
						|
       IPPORT_NETSTAT = 15;
 | 
						|
       IPPROTO_UDP = 17;
 | 
						|
       IPPROTO_IDP = 22;
 | 
						|
       IPPROTO_ND = 77;
 | 
						|
       IPPROTO_RAW = 255;
 | 
						|
       IPPROTO_MAX = 256;
 | 
						|
       IPPORT_FTP = 21;
 | 
						|
       IPPORT_TELNET = 23;
 | 
						|
       IPPORT_SMTP = 25;
 | 
						|
       IPPORT_TIMESERVER = 37;
 | 
						|
       IPPORT_NAMESERVER = 42;
 | 
						|
       IPPORT_WHOIS = 43;
 | 
						|
       IPPORT_MTP = 57;
 | 
						|
       IPPORT_TFTP = 69;
 | 
						|
       IPPORT_RJE = 77;
 | 
						|
       IPPORT_FINGER = 79;
 | 
						|
       IPPORT_TTYLINK = 87;
 | 
						|
       IPPORT_SUPDUP = 95;
 | 
						|
       IPPORT_EXECSERVER = 512;
 | 
						|
       IPPORT_LOGINSERVER = 513;
 | 
						|
       IPPORT_CMDSERVER = 514;
 | 
						|
       IPPORT_EFSSERVER = 520;
 | 
						|
       IPPORT_BIFFUDP = 512;
 | 
						|
       IPPORT_WHOSERVER = 513;
 | 
						|
       IPPORT_ROUTESERVER = 520;
 | 
						|
       IPPORT_RESERVED = 1024;
 | 
						|
 | 
						|
    const
 | 
						|
       IMPLINK_IP = 155;
 | 
						|
       IMPLINK_LOWEXPER = 156;
 | 
						|
       IMPLINK_HIGHEXPER = 158;
 | 
						|
 | 
						|
    type
 | 
						|
       SunB = packed record
 | 
						|
          s_b1,s_b2,s_b3,s_b4 : u_char;
 | 
						|
       end;
 | 
						|
 | 
						|
       SunW = packed record
 | 
						|
         s_w1,s_w2 : u_short;
 | 
						|
       end;
 | 
						|
 | 
						|
       in_addr = record
 | 
						|
          case integer of
 | 
						|
             0 : (S_un_b : SunB);
 | 
						|
             1 : (S_un_w : SunW);
 | 
						|
             2 : (S_addr : u_long);
 | 
						|
       end;
 | 
						|
       TInAddr = in_addr;
 | 
						|
       PInAddr = ^TInAddr;
 | 
						|
 | 
						|
       sockaddr_in = record
 | 
						|
          sin_family : SmallInt;                        (* 2 byte *)
 | 
						|
          case integer of
 | 
						|
             0 : ( (* equals to sockaddr_in, size is 16 byte *)
 | 
						|
                  sin_port : u_short;                   (* 2 byte *)
 | 
						|
                  sin_addr : TInAddr;                   (* 4 byte *)
 | 
						|
                  sin_zero : array[0..8-1] of char;     (* 8 byte *)
 | 
						|
                 );
 | 
						|
             1 : ( (* equals to sockaddr, size is 16 byte *)
 | 
						|
                  sin_data : array[0..14-1] of char;    (* 14 byte *)
 | 
						|
                 );
 | 
						|
         end;
 | 
						|
       TSockAddrIn = sockaddr_in;
 | 
						|
       PSockAddrIn = ^TSockAddrIn;
 | 
						|
       TSockAddr = sockaddr_in;
 | 
						|
       PSockAddr = ^TSockAddr;
 | 
						|
 | 
						|
    const
 | 
						|
       INADDR_ANY = $00000000;
 | 
						|
       INADDR_LOOPBACK = $7F000001;
 | 
						|
       INADDR_BROADCAST = $FFFFFFFF;
 | 
						|
 | 
						|
       IN_CLASSA_NET = $ff000000;
 | 
						|
       IN_CLASSA_NSHIFT = 24;
 | 
						|
       IN_CLASSA_HOST = $00ffffff;
 | 
						|
       IN_CLASSA_MAX = 128;
 | 
						|
       IN_CLASSB_NET = $ffff0000;
 | 
						|
       IN_CLASSB_NSHIFT = 16;
 | 
						|
       IN_CLASSB_HOST = $0000ffff;
 | 
						|
       IN_CLASSB_MAX = 65536;
 | 
						|
       IN_CLASSC_NET = $ffffff00;
 | 
						|
       IN_CLASSC_NSHIFT = 8;
 | 
						|
       IN_CLASSC_HOST = $000000ff;
 | 
						|
       INADDR_NONE = $ffffffff;
 | 
						|
 | 
						|
       WSADESCRIPTION_LEN = 256;
 | 
						|
       WSASYS_STATUS_LEN = 128;
 | 
						|
 | 
						|
    type
 | 
						|
       WSADATA = record
 | 
						|
          wVersion : WORD;              { 2 byte, ofs 0 }
 | 
						|
          wHighVersion : WORD;          { 2 byte, ofs 2 }
 | 
						|
          szDescription : array[0..(WSADESCRIPTION_LEN+1)-1] of char; { 257 byte, ofs 4 }
 | 
						|
          szSystemStatus : array[0..(WSASYS_STATUS_LEN+1)-1] of char; { 129 byte, ofs 261 }
 | 
						|
          iMaxSockets : word;           { 2 byte, ofs 390 }
 | 
						|
          iMaxUdpDg : word;             { 2 byte, ofs 392 }
 | 
						|
          pad1 : SmallInt;              { 2 byte, ofs 394 } { ensure right packaging }
 | 
						|
          lpVendorInfo : pchar;         { 4 byte, ofs 396 }
 | 
						|
       end;                             { total size 400 }
 | 
						|
       TWSAData = WSADATA;
 | 
						|
       PWSAData = TWSAData;
 | 
						|
 | 
						|
    const
 | 
						|
       IP_OPTIONS = 1;
 | 
						|
       IP_MULTICAST_IF = 2;
 | 
						|
       IP_MULTICAST_TTL = 3;
 | 
						|
       IP_MULTICAST_LOOP = 4;
 | 
						|
       IP_ADD_MEMBERSHIP = 5;
 | 
						|
       IP_DROP_MEMBERSHIP = 6;
 | 
						|
       IP_DEFAULT_MULTICAST_TTL = 1;
 | 
						|
       IP_DEFAULT_MULTICAST_LOOP = 1;
 | 
						|
       IP_MAX_MEMBERSHIPS = 20;
 | 
						|
 | 
						|
    type
 | 
						|
       ip_mreq = record
 | 
						|
            imr_multiaddr : in_addr;
 | 
						|
            imr_interface : in_addr;
 | 
						|
         end;
 | 
						|
 | 
						|
    {
 | 
						|
       Definitions related to sockets: types, address families, options,
 | 
						|
       taken from the BSD file sys/socket.h.
 | 
						|
    }
 | 
						|
    const
 | 
						|
       INVALID_SOCKET = not(1);
 | 
						|
       SOCKET_ERROR = $ffffffff;
 | 
						|
       SOCK_STREAM = 1;
 | 
						|
       SOCK_DGRAM = 2;
 | 
						|
       SOCK_RAW = 3;
 | 
						|
       SOCK_RDM = 4;
 | 
						|
       SOCK_SEQPACKET = 5;
 | 
						|
 | 
						|
      { For setsockoptions(2)  }
 | 
						|
       SO_DEBUG = $0001;
 | 
						|
       SO_ACCEPTCONN = $0002;
 | 
						|
       SO_REUSEADDR = $0004;
 | 
						|
       SO_KEEPALIVE = $0008;
 | 
						|
       SO_DONTROUTE = $0010;
 | 
						|
       SO_BROADCAST = $0020;
 | 
						|
       SO_USELOOPBACK = $0040;
 | 
						|
       SO_LINGER = $0080;
 | 
						|
       SO_OOBINLINE = $0100;
 | 
						|
       {
 | 
						|
         Additional options.
 | 
						|
       }
 | 
						|
       { send buffer size  }
 | 
						|
       SO_SNDBUF = $1001;
 | 
						|
       { receive buffer size  }
 | 
						|
       SO_RCVBUF = $1002;
 | 
						|
       { send low-water mark  }
 | 
						|
       SO_SNDLOWAT = $1003;
 | 
						|
       { receive low-water mark  }
 | 
						|
       SO_RCVLOWAT = $1004;
 | 
						|
       { send timeout  }
 | 
						|
       SO_SNDTIMEO = $1005;
 | 
						|
       { receive timeout  }
 | 
						|
       SO_RCVTIMEO = $1006;
 | 
						|
       { get error status and clear  }
 | 
						|
       SO_ERROR = $1007;
 | 
						|
       { get socket type  }
 | 
						|
       SO_TYPE = $1008;
 | 
						|
 | 
						|
       {
 | 
						|
         Options for connect and disconnect data and options.  Used only by
 | 
						|
         non-TCP/IP transports such as DECNet, OSI TP4, etc.
 | 
						|
       }
 | 
						|
       SO_CONNDATA = $7000;
 | 
						|
       SO_CONNOPT = $7001;
 | 
						|
       SO_DISCDATA = $7002;
 | 
						|
       SO_DISCOPT = $7003;
 | 
						|
       SO_CONNDATALEN = $7004;
 | 
						|
       SO_CONNOPTLEN = $7005;
 | 
						|
       SO_DISCDATALEN = $7006;
 | 
						|
       SO_DISCOPTLEN = $7007;
 | 
						|
 | 
						|
       {
 | 
						|
         Option for opening sockets for synchronous access.
 | 
						|
       }
 | 
						|
       SO_OPENTYPE = $7008;
 | 
						|
       SO_SYNCHRONOUS_ALERT = $10;
 | 
						|
       SO_SYNCHRONOUS_NONALERT = $20;
 | 
						|
 | 
						|
       {
 | 
						|
         Other NT-specific options.
 | 
						|
       }
 | 
						|
       SO_MAXDG = $7009;
 | 
						|
       SO_MAXPATHDG = $700A;
 | 
						|
       SO_UPDATE_ACCEPT_CONTEXT = $700B;
 | 
						|
       SO_CONNECT_TIME = $700C;
 | 
						|
 | 
						|
       {
 | 
						|
         TCP options.
 | 
						|
       }
 | 
						|
       TCP_NODELAY = $0001;
 | 
						|
       TCP_BSDURGENT = $7000;
 | 
						|
 | 
						|
       {
 | 
						|
         Address families.
 | 
						|
       }
 | 
						|
       { unspecified  }
 | 
						|
       AF_UNSPEC = 0;
 | 
						|
       { local to host (pipes, portals)  }
 | 
						|
       AF_UNIX = 1;
 | 
						|
       { internetwork: UDP, TCP, etc.  }
 | 
						|
       AF_INET = 2;
 | 
						|
       { arpanet imp addresses  }
 | 
						|
       AF_IMPLINK = 3;
 | 
						|
       { pup protocols: e.g. BSP  }
 | 
						|
       AF_PUP = 4;
 | 
						|
       { mit CHAOS protocols  }
 | 
						|
       AF_CHAOS = 5;
 | 
						|
       { IPX and SPX  }
 | 
						|
       AF_IPX = 6;
 | 
						|
       { XEROX NS protocols  }
 | 
						|
       AF_NS = 6;
 | 
						|
       { ISO protocols  }
 | 
						|
       AF_ISO = 7;
 | 
						|
       { OSI is ISO  }
 | 
						|
       AF_OSI = AF_ISO;
 | 
						|
       { european computer manufacturers  }
 | 
						|
       AF_ECMA = 8;
 | 
						|
       { datakit protocols  }
 | 
						|
       AF_DATAKIT = 9;
 | 
						|
       { CCITT protocols, X.25 etc  }
 | 
						|
       AF_CCITT = 10;
 | 
						|
       { IBM SNA  }
 | 
						|
       AF_SNA = 11;
 | 
						|
       { DECnet  }
 | 
						|
       AF_DECnet = 12;
 | 
						|
       { Direct data link interface  }
 | 
						|
       AF_DLI = 13;
 | 
						|
       { LAT  }
 | 
						|
       AF_LAT = 14;
 | 
						|
       { NSC Hyperchannel  }
 | 
						|
       AF_HYLINK = 15;
 | 
						|
       { AppleTalk  }
 | 
						|
       AF_APPLETALK = 16;
 | 
						|
       { NetBios-style addresses  }
 | 
						|
       AF_NETBIOS = 17;
 | 
						|
       { VoiceView }
 | 
						|
       AF_VOICEVIEW = 18;
 | 
						|
       { FireFox }
 | 
						|
       AF_FIREFOX = 19;
 | 
						|
       { Somebody is using this! }
 | 
						|
       AF_UNKNOWN1 = 20;
 | 
						|
       { Banyan }
 | 
						|
       AF_BAN = 21;
 | 
						|
 | 
						|
       AF_MAX = 22;
 | 
						|
 | 
						|
    type
 | 
						|
       {
 | 
						|
         Structure used by kernel to pass protocol
 | 
						|
         information in raw sockets.
 | 
						|
       }
 | 
						|
       sockproto = record
 | 
						|
          sp_family : u_short;
 | 
						|
          sp_protocol : u_short;
 | 
						|
       end;
 | 
						|
       TSockProto = sockproto;
 | 
						|
       PSockProto = ^TSockProto;
 | 
						|
 | 
						|
    const
 | 
						|
       {
 | 
						|
         Protocol families, same as address families for now.
 | 
						|
       }
 | 
						|
       PF_UNSPEC = AF_UNSPEC;
 | 
						|
       PF_UNIX = AF_UNIX;
 | 
						|
       PF_INET = AF_INET;
 | 
						|
       PF_IMPLINK = AF_IMPLINK;
 | 
						|
       PF_PUP = AF_PUP;
 | 
						|
       PF_CHAOS = AF_CHAOS;
 | 
						|
       PF_NS = AF_NS;
 | 
						|
       PF_IPX = AF_IPX;
 | 
						|
       PF_ISO = AF_ISO;
 | 
						|
       PF_OSI = AF_OSI;
 | 
						|
       PF_ECMA = AF_ECMA;
 | 
						|
       PF_DATAKIT = AF_DATAKIT;
 | 
						|
       PF_CCITT = AF_CCITT;
 | 
						|
       PF_SNA = AF_SNA;
 | 
						|
       PF_DECnet = AF_DECnet;
 | 
						|
       PF_DLI = AF_DLI;
 | 
						|
       PF_LAT = AF_LAT;
 | 
						|
       PF_HYLINK = AF_HYLINK;
 | 
						|
       PF_APPLETALK = AF_APPLETALK;
 | 
						|
       PF_VOICEVIEW = AF_VOICEVIEW;
 | 
						|
       PF_FIREFOX = AF_FIREFOX;
 | 
						|
       PF_UNKNOWN1 = AF_UNKNOWN1;
 | 
						|
       PF_BAN = AF_BAN;
 | 
						|
       PF_MAX = AF_MAX;
 | 
						|
 | 
						|
    type
 | 
						|
       {
 | 
						|
         Structure used for manipulating linger option.
 | 
						|
       }
 | 
						|
       linger = record
 | 
						|
          l_onoff : u_short;
 | 
						|
          l_linger : u_short;
 | 
						|
       end;
 | 
						|
       TLinger = linger;
 | 
						|
       PLinger = ^TLinger;
 | 
						|
 | 
						|
    const
 | 
						|
       {
 | 
						|
         Level number for (get/set)sockopt() to apply to socket itself.
 | 
						|
       }
 | 
						|
       { options for socket level  }
 | 
						|
       SOL_SOCKET = $ffff;
 | 
						|
       {
 | 
						|
         Maximum queue length specifiable by listen.
 | 
						|
       }
 | 
						|
       SOMAXCONN = 5;
 | 
						|
       { process out-of-band data  }
 | 
						|
       MSG_OOB = $1;
 | 
						|
       { peek at incoming message  }
 | 
						|
       MSG_PEEK = $2;
 | 
						|
       { send without using routing tables  }
 | 
						|
       MSG_DONTROUTE = $4;
 | 
						|
       MSG_MAXIOVLEN = 16;
 | 
						|
       { partial send or recv for message xport  }
 | 
						|
       MSG_PARTIAL = $8000;
 | 
						|
 | 
						|
       {
 | 
						|
         Define constant based on rfc883, used by gethostbyxxxx() calls.
 | 
						|
       }
 | 
						|
       MAXGETHOSTSTRUCT = 1024;
 | 
						|
       MAXHOSTNAMELEN = MAXGETHOSTSTRUCT;
 | 
						|
 | 
						|
       {
 | 
						|
         Define flags to be used with the WSAAsyncSelect() call.
 | 
						|
       }
 | 
						|
       FD_READ = $01;
 | 
						|
       FD_WRITE = $02;
 | 
						|
       FD_OOB = $04;
 | 
						|
       FD_ACCEPT = $08;
 | 
						|
       FD_CONNECT = $10;
 | 
						|
       FD_CLOSE = $20;
 | 
						|
 | 
						|
       {
 | 
						|
         All Windows Sockets error constants are biased by WSABASEERR from
 | 
						|
         the "normal"
 | 
						|
       }
 | 
						|
       WSABASEERR = 10000;
 | 
						|
 | 
						|
       {
 | 
						|
         Windows Sockets definitions of regular Microsoft C error constants
 | 
						|
       }
 | 
						|
       WSAEINTR = WSABASEERR + 4;
 | 
						|
       WSAEBADF = WSABASEERR + 9;
 | 
						|
       WSAEACCES = WSABASEERR + 13;
 | 
						|
       WSAEFAULT = WSABASEERR + 14;
 | 
						|
       WSAEINVAL = WSABASEERR + 22;
 | 
						|
       WSAEMFILE = WSABASEERR + 24;
 | 
						|
 | 
						|
       {
 | 
						|
         Windows Sockets definitions of regular Berkeley error constants
 | 
						|
       }
 | 
						|
       WSAEWOULDBLOCK = WSABASEERR + 35;
 | 
						|
       WSAEINPROGRESS = WSABASEERR + 36;
 | 
						|
       WSAEALREADY = WSABASEERR + 37;
 | 
						|
       WSAENOTSOCK = WSABASEERR + 38;
 | 
						|
       WSAEDESTADDRREQ = WSABASEERR + 39;
 | 
						|
       WSAEMSGSIZE = WSABASEERR + 40;
 | 
						|
       WSAEPROTOTYPE = WSABASEERR + 41;
 | 
						|
       WSAENOPROTOOPT = WSABASEERR + 42;
 | 
						|
       WSAEPROTONOSUPPORT = WSABASEERR + 43;
 | 
						|
       WSAESOCKTNOSUPPORT = WSABASEERR + 44;
 | 
						|
       WSAEOPNOTSUPP = WSABASEERR + 45;
 | 
						|
       WSAEPFNOSUPPORT = WSABASEERR + 46;
 | 
						|
       WSAEAFNOSUPPORT = WSABASEERR + 47;
 | 
						|
       WSAEADDRINUSE = WSABASEERR + 48;
 | 
						|
       WSAEADDRNOTAVAIL = WSABASEERR + 49;
 | 
						|
       WSAENETDOWN = WSABASEERR + 50;
 | 
						|
       WSAENETUNREACH = WSABASEERR + 51;
 | 
						|
       WSAENETRESET = WSABASEERR + 52;
 | 
						|
       WSAECONNABORTED = WSABASEERR + 53;
 | 
						|
       WSAECONNRESET = WSABASEERR + 54;
 | 
						|
       WSAENOBUFS = WSABASEERR + 55;
 | 
						|
       WSAEISCONN = WSABASEERR + 56;
 | 
						|
       WSAENOTCONN = WSABASEERR + 57;
 | 
						|
       WSAESHUTDOWN = WSABASEERR + 58;
 | 
						|
       WSAETOOMANYREFS = WSABASEERR + 59;
 | 
						|
       WSAETIMEDOUT = WSABASEERR + 60;
 | 
						|
       WSAECONNREFUSED = WSABASEERR + 61;
 | 
						|
       WSAELOOP = WSABASEERR + 62;
 | 
						|
       WSAENAMETOOLONG = WSABASEERR + 63;
 | 
						|
       WSAEHOSTDOWN = WSABASEERR + 64;
 | 
						|
       WSAEHOSTUNREACH = WSABASEERR + 65;
 | 
						|
       WSAENOTEMPTY = WSABASEERR + 66;
 | 
						|
       WSAEPROCLIM = WSABASEERR + 67;
 | 
						|
       WSAEUSERS = WSABASEERR + 68;
 | 
						|
       WSAEDQUOT = WSABASEERR + 69;
 | 
						|
       WSAESTALE = WSABASEERR + 70;
 | 
						|
       WSAEREMOTE = WSABASEERR + 71;
 | 
						|
       WSAEDISCON = WSABASEERR + 101;
 | 
						|
 | 
						|
       {
 | 
						|
         Extended Windows Sockets error constant definitions
 | 
						|
       }
 | 
						|
       WSASYSNOTREADY = WSABASEERR + 91;
 | 
						|
       WSAVERNOTSUPPORTED = WSABASEERR + 92;
 | 
						|
       WSANOTINITIALISED = WSABASEERR + 93;
 | 
						|
       {
 | 
						|
         Error return codes from gethostbyname() and gethostbyaddr()
 | 
						|
         (when using the resolver). Note that these errors are
 | 
						|
         retrieved via WSAGetLastError() and must therefore follow
 | 
						|
         the rules for avoiding clashes with error numbers from
 | 
						|
         specific implementations or language run-time systems.
 | 
						|
         For this reason the codes are based at WSABASEERR+1001.
 | 
						|
         Note also that [WSA]NO_ADDRESS is defined only for
 | 
						|
         compatibility purposes.
 | 
						|
        }
 | 
						|
       WSAHOST_NOT_FOUND = WSABASEERR + 1001;
 | 
						|
       HOST_NOT_FOUND = WSAHOST_NOT_FOUND;
 | 
						|
       { Non-Authoritative: Host not found, or SERVERFAIL  }
 | 
						|
       WSATRY_AGAIN = WSABASEERR + 1002;
 | 
						|
       TRY_AGAIN = WSATRY_AGAIN;
 | 
						|
 | 
						|
       { Non recoverable errors, FORMERR, REFUSED, NOTIMP  }
 | 
						|
       WSANO_RECOVERY = WSABASEERR + 1003;
 | 
						|
       NO_RECOVERY = WSANO_RECOVERY;
 | 
						|
 | 
						|
       { Valid name, no data record of requested type  }
 | 
						|
       WSANO_DATA = WSABASEERR + 1004;
 | 
						|
       NO_DATA = WSANO_DATA;
 | 
						|
 | 
						|
       { no address, look for MX record  }
 | 
						|
       WSANO_ADDRESS = WSANO_DATA;
 | 
						|
       NO_ADDRESS = WSANO_ADDRESS;
 | 
						|
 | 
						|
    const
 | 
						|
       {
 | 
						|
         Windows Sockets errors redefined as regular Berkeley error constants.
 | 
						|
       }
 | 
						|
       EWOULDBLOCK = WSAEWOULDBLOCK;
 | 
						|
       EINPROGRESS = WSAEINPROGRESS;
 | 
						|
       EALREADY = WSAEALREADY;
 | 
						|
       ENOTSOCK = WSAENOTSOCK;
 | 
						|
       EDESTADDRREQ = WSAEDESTADDRREQ;
 | 
						|
       EMSGSIZE = WSAEMSGSIZE;
 | 
						|
       EPROTOTYPE = WSAEPROTOTYPE;
 | 
						|
       ENOPROTOOPT = WSAENOPROTOOPT;
 | 
						|
       EPROTONOSUPPORT = WSAEPROTONOSUPPORT;
 | 
						|
       ESOCKTNOSUPPORT = WSAESOCKTNOSUPPORT;
 | 
						|
       EOPNOTSUPP = WSAEOPNOTSUPP;
 | 
						|
       EPFNOSUPPORT = WSAEPFNOSUPPORT;
 | 
						|
       EAFNOSUPPORT = WSAEAFNOSUPPORT;
 | 
						|
       EADDRINUSE = WSAEADDRINUSE;
 | 
						|
       EADDRNOTAVAIL = WSAEADDRNOTAVAIL;
 | 
						|
       ENETDOWN = WSAENETDOWN;
 | 
						|
       ENETUNREACH = WSAENETUNREACH;
 | 
						|
       ENETRESET = WSAENETRESET;
 | 
						|
       ECONNABORTED = WSAECONNABORTED;
 | 
						|
       ECONNRESET = WSAECONNRESET;
 | 
						|
       ENOBUFS = WSAENOBUFS;
 | 
						|
       EISCONN = WSAEISCONN;
 | 
						|
       ENOTCONN = WSAENOTCONN;
 | 
						|
       ESHUTDOWN = WSAESHUTDOWN;
 | 
						|
       ETOOMANYREFS = WSAETOOMANYREFS;
 | 
						|
       ETIMEDOUT = WSAETIMEDOUT;
 | 
						|
       ECONNREFUSED = WSAECONNREFUSED;
 | 
						|
       ELOOP = WSAELOOP;
 | 
						|
       ENAMETOOLONG = WSAENAMETOOLONG;
 | 
						|
       EHOSTDOWN = WSAEHOSTDOWN;
 | 
						|
       EHOSTUNREACH = WSAEHOSTUNREACH;
 | 
						|
       ENOTEMPTY = WSAENOTEMPTY;
 | 
						|
       EPROCLIM = WSAEPROCLIM;
 | 
						|
       EUSERS = WSAEUSERS;
 | 
						|
       EDQUOT = WSAEDQUOT;
 | 
						|
       ESTALE = WSAESTALE;
 | 
						|
       EREMOTE = WSAEREMOTE;
 | 
						|
 | 
						|
       TF_DISCONNECT = $01;
 | 
						|
       TF_REUSE_SOCKET = $02;
 | 
						|
       TF_WRITE_BEHIND = $04;
 | 
						|
 | 
						|
       {
 | 
						|
         Options for use with [gs]etsockopt at the IP level.
 | 
						|
       }
 | 
						|
       IP_TTL = 7;
 | 
						|
       IP_TOS = 8;
 | 
						|
       IP_DONTFRAGMENT = 9;
 | 
						|
 | 
						|
    type
 | 
						|
       _TRANSMIT_FILE_BUFFERS = record
 | 
						|
          Head : Pointer;
 | 
						|
          HeadLength : dword;
 | 
						|
          Tail : Pointer;
 | 
						|
          TailLength : dword;
 | 
						|
       end;
 | 
						|
       TRANSMIT_FILE_BUFFERS = _TRANSMIT_FILE_BUFFERS;
 | 
						|
       TTransmitFileBuffers = _TRANSMIT_FILE_BUFFERS;
 | 
						|
       PTransmitFileBuffers = ^TTransmitFileBuffers;
 | 
						|
 | 
						|
    { Socket function prototypes  }
 | 
						|
    function accept(s:TSocket; addr: PSockAddr; addrlen : ptOS_INT) : TSocket;stdcall;
 | 
						|
    function accept(s:TSocket; addr: PSockAddr; var addrlen : tOS_INT) : TSocket;stdcall;
 | 
						|
    function bind(s:TSocket; addr: PSockaddr;namelen:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function closesocket(s:TSocket):tOS_INT;stdcall;
 | 
						|
    function connect(s:TSocket; var name:TSockAddr; namelen:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function ioctlsocket(s:TSocket; cmd:longint; argp:pu_long):tOS_INT;stdcall; { really a c-long }
 | 
						|
    function getpeername(s:TSocket; var name:TSockAddr;var namelen:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function getsockname(s:TSocket; var name:TSockAddr;var namelen:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function getsockopt(s:TSocket; level:tOS_INT; optname:tOS_INT; optval:pchar;var optlen:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function getsockopt(s:TSocket; level:tOS_INT; optname:tOS_INT; var optval; var optlen:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function htonl(hostlong:u_long):u_long;stdcall;
 | 
						|
    function htons(hostshort:u_short):u_short;
 | 
						|
    function inet_addr(cp:pchar):cardinal;stdcall;
 | 
						|
    function inet_ntoa(i : TInAddr):pchar;stdcall;
 | 
						|
    function listen(s:TSocket; backlog:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function ntohl(netlong:u_long):u_long;stdcall;
 | 
						|
    function ntohs(netshort:u_short):u_short;stdcall;
 | 
						|
    function recv(s:TSocket;var buf; len:tOS_INT; flags:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function recvfrom(s:TSocket;var buf; len:tOS_INT; flags:tOS_INT;var from:TSockAddr; fromlen:ptOS_INT):tOS_INT;stdcall;
 | 
						|
    function select(nfds:tOS_INT; readfds,writefds,exceptfds : PFDSet;timeout: PTimeVal):tOS_INT;stdcall;
 | 
						|
    function send(s:TSocket;var buf; len:tOS_INT; flags:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function sendto(s:TSocket; buf:pchar; len:tOS_INT; flags:tOS_INT;var toaddr:TSockAddr; tolen:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function setsockopt(s:TSocket; level:tOS_INT; optname:tOS_INT; optval:pchar; optlen:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function setsockopt(s:TSocket; level:tOS_INT; optname:tOS_INT; var optval; optlen:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function shutdown(s:TSocket; how:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function socket(af:tOS_INT; t:tOS_INT; protocol:tOS_INT):TSocket;stdcall;
 | 
						|
 | 
						|
    { Database function prototypes  }
 | 
						|
    function gethostbyaddr(addr:pchar; len:tOS_INT; t:tOS_INT): PHostEnt;stdcall;
 | 
						|
    function gethostbyname(name:pchar):PHostEnt;stdcall;
 | 
						|
    function gethostname(name:pchar; namelen:tOS_INT):tOS_INT;stdcall;
 | 
						|
    function getservbyport(port:tOS_INT; proto:pchar):PServEnt;stdcall;
 | 
						|
    function getservbyname(name:pchar; proto:pchar):PServEnt;stdcall;
 | 
						|
    function getprotobynumber(proto:tOS_INT):PProtoEnt;stdcall;
 | 
						|
    function getprotobyname(name:pchar):PProtoEnt;stdcall;
 | 
						|
 | 
						|
    { Microsoft Windows Extension function prototypes  }
 | 
						|
    function WSAStartup(wVersionRequired:word;var WSAData:TWSADATA):tOS_INT;stdcall;
 | 
						|
    function WSACleanup:tOS_INT;stdcall;
 | 
						|
    procedure WSASetLastError(iError:tOS_INT);stdcall;
 | 
						|
    function WSAGetLastError:tOS_INT;stdcall;
 | 
						|
    function WSAIsBlocking:BOOL;stdcall;
 | 
						|
    function WSAUnhookBlockingHook:tOS_INT;stdcall;
 | 
						|
    function WSASetBlockingHook(lpBlockFunc:TFarProc):TFarProc;stdcall;
 | 
						|
    function WSACancelBlockingCall:tOS_INT;stdcall;
 | 
						|
    function WSAAsyncGetServByName(hWnd:HWND; wMsg:u_int; name:pchar; proto:pchar; buf:pchar;
 | 
						|
                                   buflen:tOS_INT):THandle;stdcall;
 | 
						|
    function WSAAsyncGetServByPort(hWnd:HWND; wMsg:u_int; port:tOS_INT; proto:pchar; buf:pchar;
 | 
						|
                                   buflen:tOS_INT):THandle;stdcall;
 | 
						|
    function WSAAsyncGetProtoByName(hWnd:HWND; wMsg:u_int; name:pchar; buf:pchar; buflen:tOS_INT):THandle;stdcall;
 | 
						|
    function WSAAsyncGetProtoByNumber(hWnd:HWND; wMsg:u_int; number:tOS_INT; buf:pchar; buflen:tOS_INT):THandle;stdcall;
 | 
						|
    function WSAAsyncGetHostByName(hWnd:HWND; wMsg:u_int; name:pchar; buf:pchar; buflen:tOS_INT):THandle;stdcall;
 | 
						|
    function WSAAsyncGetHostByAddr(hWnd:HWND; wMsg:u_int; addr:pchar; len:tOS_INT; t:tOS_INT;
 | 
						|
                                   buf:pchar; buflen:tOS_INT):THandle;stdcall;
 | 
						|
    function WSACancelAsyncRequest(hAsyncTaskHandle:THandle):tOS_INT;stdcall;
 | 
						|
    function WSAAsyncSelect(s:TSocket; hWnd:HWND; wMsg:u_int; lEvent:longint):tOS_INT;stdcall; { really a c-long }
 | 
						|
    function WSARecvEx(s:TSocket;var buf; len:tOS_INT; flags:ptOS_INT):tOS_INT;stdcall;
 | 
						|
 | 
						|
    { the following stuff was missed in my sockets.h (FK) }
 | 
						|
    function __WSAFDIsSet(s:TSocket; var FDSet:TFDSet):Bool;stdcall;
 | 
						|
    function __WSAFDIsSet_(s:TSocket; var FDSet:TFDSet):tOS_INT;stdcall;
 | 
						|
    function TransmitFile(hSocket:TSocket; hFile:THandle; nNumberOfBytesToWrite:dword;
 | 
						|
                          nNumberOfBytesPerSend:DWORD; lpOverlapped:POverlapped;
 | 
						|
                          lpTransmitBuffers:PTransmitFileBuffers; dwReserved:dword):Bool;stdcall;
 | 
						|
 | 
						|
    function AcceptEx(sListenSocket,sAcceptSocket:TSocket;
 | 
						|
                      lpOutputBuffer:Pointer; dwReceiveDataLength,dwLocalAddressLength,
 | 
						|
                      dwRemoteAddressLength:dword; var lpdwBytesReceived:dword;
 | 
						|
                      lpOverlapped:POverlapped):Bool;stdcall;
 | 
						|
 | 
						|
    procedure GetAcceptExSockaddrs(lpOutputBuffer:Pointer;
 | 
						|
                                   dwReceiveDataLength,dwLocalAddressLength,dwRemoteAddressLength:dword;
 | 
						|
                                   var LocalSockaddr:TSockAddr; var LocalSockaddrLength:tOS_INT;
 | 
						|
                                   var RemoteSockaddr:TSockAddr; var RemoteSockaddrLength:tOS_INT);stdcall;
 | 
						|
 | 
						|
    function WSAMakeSyncReply(Buflen,Error:Word):dword;
 | 
						|
    function WSAMakeSelectReply(Event,Error:Word):dword;
 | 
						|
    function WSAGetAsyncBuflen(Param:dword):Word;
 | 
						|
    function WSAGetAsyncError(Param:dword):Word;
 | 
						|
    function WSAGetSelectEvent(Param:dword):Word;
 | 
						|
    function WSAGetSelectError(Param:dword):Word;
 | 
						|
    procedure FD_CLR(Socket:TSocket; var FDSet:TFDSet);
 | 
						|
    function FD_ISSET(Socket:TSocket; var FDSet:TFDSet):Boolean;
 | 
						|
    procedure FD_SET(Socket:TSocket; var FDSet:TFDSet);
 | 
						|
    procedure FD_ZERO(var FDSet:TFDSet);
 | 
						|
 | 
						|
  implementation
 | 
						|
 | 
						|
    const
 | 
						|
       winsockdll = 'wsock32.dll';
 | 
						|
 | 
						|
    { Socket function prototypes  }
 | 
						|
    function accept(s:TSocket; addr: PSockAddr; addrlen : ptOS_INT) : TSocket;stdcall;external winsockdll name 'accept';
 | 
						|
    function accept(s:TSocket; addr: PSockAddr; var addrlen : tOS_INT) : TSocket;stdcall;external winsockdll name 'accept';
 | 
						|
    function bind(s:TSocket; addr: PSockaddr;namelen:tOS_INT):tOS_INT;stdcall;external winsockdll name 'bind';
 | 
						|
    function closesocket(s:TSocket):tOS_INT;stdcall;external winsockdll name 'closesocket';
 | 
						|
    function connect(s:TSocket; var name:TSockAddr; namelen:tOS_INT):tOS_INT;stdcall;external winsockdll name 'connect';
 | 
						|
    function ioctlsocket(s:TSocket; cmd:longint; argp:pu_long):tOS_INT;stdcall;external winsockdll name 'ioctlsocket'; { really a c-long }
 | 
						|
    function getpeername(s:TSocket; var name:TSockAddr;var namelen:tOS_INT):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'getpeername';
 | 
						|
    function getsockname(s:TSocket; var name:TSockAddr;var namelen:tOS_INT):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'getsockname';
 | 
						|
    function getsockopt(s:TSocket; level:tOS_INT; optname:tOS_INT; optval:pchar;var optlen:tOS_INT):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'getsockopt';
 | 
						|
    function getsockopt(s:TSocket; level:tOS_INT; optname:tOS_INT;var optval;var optlen:tOS_INT):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'getsockopt';
 | 
						|
    function htonl(hostlong:u_long):u_long;stdcall;external winsockdll name 'htonl';
 | 
						|
    function htons(hostshort:u_short):u_short;external winsockdll name 'htons';
 | 
						|
    function inet_addr(cp:pchar):cardinal;stdcall;external winsockdll name 'inet_addr';
 | 
						|
    function inet_ntoa(i : TInAddr):pchar;stdcall;external winsockdll name 'inet_ntoa';
 | 
						|
    function listen(s:TSocket; backlog:tOS_INT):tOS_INT;stdcall;external winsockdll name 'listen';
 | 
						|
    function ntohl(netlong:u_long):u_long;stdcall;external winsockdll name 'ntohl';
 | 
						|
    function ntohs(netshort:u_short):u_short;stdcall;external winsockdll name 'ntohs';
 | 
						|
    function recv(s:TSocket;var buf; len:tOS_INT; flags:tOS_INT):tOS_INT;stdcall;external winsockdll name 'recv';
 | 
						|
    function recvfrom(s:TSocket;var buf; len:tOS_INT; flags:tOS_INT;var from:TSockAddr; fromlen:ptOS_INT):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'recvfrom';
 | 
						|
    function select(nfds:tOS_INT; readfds,writefds,exceptfds : PFDSet;timeout: PTimeVal):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'select';
 | 
						|
    function send(s:TSocket;var buf; len:tOS_INT; flags:tOS_INT):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'send';
 | 
						|
    function sendto(s:TSocket; buf:pchar; len:tOS_INT; flags:tOS_INT;var toaddr:TSockAddr; tolen:tOS_INT):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'sendto';
 | 
						|
    function setsockopt(s:TSocket; level:tOS_INT; optname:tOS_INT; optval:pchar; optlen:tOS_INT):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'setsockopt';
 | 
						|
    function setsockopt(s:TSocket; level:tOS_INT; optname:tOS_INT; var optval; optlen:tOS_INT):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'setsockopt';
 | 
						|
    function shutdown(s:TSocket; how:tOS_INT):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'shutdown';
 | 
						|
    function socket(af:tOS_INT; t:tOS_INT; protocol:tOS_INT):TSocket;stdcall;
 | 
						|
      external winsockdll name 'socket';
 | 
						|
 | 
						|
    { Database function prototypes  }
 | 
						|
    function gethostbyaddr(addr:pchar; len:tOS_INT; t:tOS_INT): PHostEnt;stdcall;external winsockdll name 'gethostbyaddr';
 | 
						|
    function gethostbyname(name:pchar):PHostEnt;stdcall;external winsockdll name 'gethostbyname';
 | 
						|
    function gethostname(name:pchar; namelen:tOS_INT):tOS_INT;stdcall;external winsockdll name 'gethostname';
 | 
						|
    function getservbyport(port:tOS_INT; proto:pchar):PServEnt;stdcall;external winsockdll name 'getservbyport';
 | 
						|
    function getservbyname(name:pchar; proto:pchar):PServEnt;stdcall;external winsockdll name 'getservbyname';
 | 
						|
    function getprotobynumber(proto:tOS_INT):PProtoEnt;stdcall;external winsockdll name 'getprotobynumber';
 | 
						|
    function getprotobyname(name:pchar):PProtoEnt;stdcall;external winsockdll name 'getprotobyname';
 | 
						|
 | 
						|
    { Microsoft Windows Extension function prototypes  }
 | 
						|
    function WSAStartup(wVersionRequired:word;var WSAData:TWSADATA):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'WSAStartup';
 | 
						|
    function WSACleanup:tOS_INT;stdcall;external winsockdll name 'WSACleanup';
 | 
						|
    procedure WSASetLastError(iError:tOS_INT);stdcall;external winsockdll name 'WSASetLastError';
 | 
						|
    function WSAGetLastError:tOS_INT;stdcall;external winsockdll name 'WSAGetLastError';
 | 
						|
    function WSAIsBlocking:BOOL;stdcall;external winsockdll name 'WSAIsBlocking';
 | 
						|
    function WSAUnhookBlockingHook:tOS_INT;stdcall;external winsockdll name 'WSAUnhookBlockingHook';
 | 
						|
    function WSASetBlockingHook(lpBlockFunc:TFarProc):TFarProc;stdcall;external winsockdll name 'WSASetBlockingHook';
 | 
						|
    function WSACancelBlockingCall:tOS_INT;stdcall;external winsockdll name 'WSACancelBlockingCall';
 | 
						|
    function WSAAsyncGetServByName(hWnd:HWND; wMsg:u_int; name:pchar; proto:pchar; buf:pchar;
 | 
						|
                                   buflen:tOS_INT):THandle;stdcall;external winsockdll name 'WSAAsyncGetServByName';
 | 
						|
    function WSAAsyncGetServByPort(hWnd:HWND; wMsg:u_int; port:tOS_INT; proto:pchar; buf:pchar;
 | 
						|
                                   buflen:tOS_INT):THandle;stdcall;external winsockdll name 'WSAAsyncGetServByPort';
 | 
						|
    function WSAAsyncGetProtoByName(hWnd:HWND; wMsg:u_int; name:pchar; buf:pchar; buflen:tOS_INT):THandle;stdcall;
 | 
						|
      external winsockdll name 'WSAAsyncGetProtoByName';
 | 
						|
    function WSAAsyncGetProtoByNumber(hWnd:HWND; wMsg:u_int; number:tOS_INT; buf:pchar; buflen:tOS_INT):THandle;stdcall;
 | 
						|
      external winsockdll name 'WSAAsyncGetProtoByNumber';
 | 
						|
    function WSAAsyncGetHostByName(hWnd:HWND; wMsg:u_int; name:pchar; buf:pchar; buflen:tOS_INT):THandle;stdcall;
 | 
						|
      external winsockdll name 'WSAAsyncGetHostByName';
 | 
						|
    function WSAAsyncGetHostByAddr(hWnd:HWND; wMsg:u_int; addr:pchar; len:tOS_INT; t:tOS_INT;
 | 
						|
                                   buf:pchar; buflen:tOS_INT):THandle;stdcall;
 | 
						|
                                   external winsockdll name 'WSAAsyncGetHostByAddr';
 | 
						|
    function WSACancelAsyncRequest(hAsyncTaskHandle:THandle):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'WSACancelAsyncRequest';
 | 
						|
    function WSAAsyncSelect(s:TSocket; hWnd:HWND; wMsg:u_int; lEvent:longint):tOS_INT;stdcall; { really a c-long }
 | 
						|
      external winsockdll name 'WSAAsyncSelect';
 | 
						|
    function WSARecvEx(s:TSocket;var buf; len:tOS_INT; flags:ptOS_INT):tOS_INT;stdcall;
 | 
						|
      external winsockdll name 'WSARecvEx';
 | 
						|
    function __WSAFDIsSet(s:TSocket; var FDSet:TFDSet):Bool;stdcall;
 | 
						|
      external winsockdll name '__WSAFDIsSet';
 | 
						|
    function __WSAFDIsSet_(s:TSocket; var FDSet:TFDSet):tOS_INT;stdcall;
 | 
						|
      external winsockdll name '__WSAFDIsSet';
 | 
						|
    function TransmitFile(hSocket:TSocket; hFile:THandle; nNumberOfBytesToWrite:dword;
 | 
						|
                          nNumberOfBytesPerSend:DWORD; lpOverlapped:POverlapped;
 | 
						|
                          lpTransmitBuffers:PTransmitFileBuffers; dwReserved:dword):Bool;stdcall;
 | 
						|
                          external winsockdll name 'TransmitFile';
 | 
						|
 | 
						|
    function AcceptEx(sListenSocket,sAcceptSocket:TSocket;
 | 
						|
                      lpOutputBuffer:Pointer; dwReceiveDataLength,dwLocalAddressLength,
 | 
						|
                      dwRemoteAddressLength:dword; var lpdwBytesReceived:dword;
 | 
						|
                      lpOverlapped:POverlapped):Bool;stdcall;
 | 
						|
                      external winsockdll name 'AcceptEx';
 | 
						|
 | 
						|
    procedure GetAcceptExSockaddrs(lpOutputBuffer:Pointer;
 | 
						|
                                   dwReceiveDataLength,dwLocalAddressLength,dwRemoteAddressLength:dword;
 | 
						|
                                   var LocalSockaddr:TSockAddr; var LocalSockaddrLength:tOS_INT;
 | 
						|
                                   var RemoteSockaddr:TSockAddr; var RemoteSockaddrLength:tOS_INT);stdcall;
 | 
						|
                                   external winsockdll name 'GetAcceptExSockaddrs';
 | 
						|
 | 
						|
    {
 | 
						|
      Implementation of the helper routines
 | 
						|
    }
 | 
						|
    function WSAMakeSyncReply(Buflen,Error:Word):dword;
 | 
						|
 | 
						|
      begin
 | 
						|
         WSAMakeSyncReply:=MakeLong(Buflen, Error);
 | 
						|
      end;
 | 
						|
 | 
						|
    function WSAMakeSelectReply(Event,Error:Word):dword;
 | 
						|
 | 
						|
      begin
 | 
						|
         WSAMakeSelectReply:=MakeLong(Event,Error);
 | 
						|
      end;
 | 
						|
 | 
						|
    function WSAGetAsyncBuflen(Param:dword):Word;
 | 
						|
 | 
						|
      begin
 | 
						|
         WSAGetAsyncBuflen:=lo(Param);
 | 
						|
      end;
 | 
						|
 | 
						|
    function WSAGetAsyncError(Param:dword):Word;
 | 
						|
 | 
						|
      begin
 | 
						|
         WSAGetAsyncError:=hi(Param);
 | 
						|
      end;
 | 
						|
 | 
						|
    function WSAGetSelectEvent(Param:dword):Word;
 | 
						|
 | 
						|
      begin
 | 
						|
         WSAGetSelectEvent:=lo(Param);
 | 
						|
      end;
 | 
						|
 | 
						|
    function WSAGetSelectError(Param:dword):Word;
 | 
						|
 | 
						|
      begin
 | 
						|
         WSAGetSelectError:=hi(Param);
 | 
						|
      end;
 | 
						|
 | 
						|
    procedure FD_CLR(Socket:TSocket; var FDSet:TFDSet);
 | 
						|
 | 
						|
      var
 | 
						|
         i : u_int;
 | 
						|
 | 
						|
      begin
 | 
						|
         i:=0;
 | 
						|
         while i<FDSet.fd_count do
 | 
						|
           begin
 | 
						|
              if FDSet.fd_array[i]=Socket then
 | 
						|
                begin
 | 
						|
                   while i<FDSet.fd_count-1 do
 | 
						|
                     begin
 | 
						|
                        FDSet.fd_array[i]:=FDSet.fd_array[i+1];
 | 
						|
                        inc(i);
 | 
						|
                     end;
 | 
						|
                   dec(FDSet.fd_count);
 | 
						|
                   break;
 | 
						|
                end;
 | 
						|
              inc(i);
 | 
						|
           end;
 | 
						|
      end;
 | 
						|
 | 
						|
    function FD_ISSET(Socket:TSocket; var FDSet:TFDSet):Boolean;
 | 
						|
 | 
						|
      begin
 | 
						|
         FD_ISSET:=__WSAFDIsSet(Socket,FDSet);
 | 
						|
      end;
 | 
						|
 | 
						|
    procedure FD_SET(Socket:TSocket; var FDSet:TFDSet);
 | 
						|
 | 
						|
      begin
 | 
						|
         if FDSet.fd_count<FD_SETSIZE then
 | 
						|
           begin
 | 
						|
              FDSet.fd_array[FDSet.fd_count]:=Socket;
 | 
						|
              Inc(FDSet.fd_count);
 | 
						|
           end;
 | 
						|
      end;
 | 
						|
 | 
						|
    procedure FD_ZERO(var FDSet:TFDSet);
 | 
						|
 | 
						|
      begin
 | 
						|
         FDSet.fd_count:=0;
 | 
						|
      end;
 | 
						|
 | 
						|
end.
 | 
						|
{
 | 
						|
  $Log$
 | 
						|
  Revision 1.4  2001-04-10 21:26:00  peter
 | 
						|
    * fixed argument names
 | 
						|
 | 
						|
  Revision 1.3  2000/12/18 17:28:58  jonas
 | 
						|
    * fixed range check errors
 | 
						|
 | 
						|
  Revision 1.2  2000/07/13 11:33:58  michael
 | 
						|
  + removed logs
 | 
						|
 | 
						|
}
 |