Browse Source

+ initial revision, should be completly compatible with the delphi
winsock unit

florian 26 years ago
parent
commit
e8172b7192
1 changed files with 930 additions and 0 deletions
  1. 930 0
      rtl/win32/winsock.pp

+ 930 - 0
rtl/win32/winsock.pp

@@ -0,0 +1,930 @@
+{
+    $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 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 4}
+unit winsock;
+
+  interface
+
+    uses
+       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 = cardinal;
+       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;
+
+       { minutes west of Greenwich  }
+       { type of dst correction  }
+       timezone = record
+          tz_minuteswest : longint;
+          tz_dsttime : longint;
+       end;
+       TTimeZone = timezone;
+       PTimeZoen = ^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
+         (101 shl 8) or 127;
+       FIONBIO = IOC_IN or 
+         ((4 and IOCPARM_MASK) shl 16) or
+         (101 shl 8) or 126;
+       FIOASYNC     = IOC_IN or 
+         ((4 and IOCPARM_MASK) shl 16) or
+         (101 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: integer;
+          { length of address  }
+          h_length: integer;
+          { 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 : integer;
+          { 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 : integer;
+          { 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 : integer;
+       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
+          case integer of
+             0 : (
+                  sin_family : u_short;
+                  sin_port : u_short;
+                  sin_addr : TInAddr;
+                  sin_zero : array[0..7] of char;
+                 );
+             1 : (sin_family : u_short;
+                  sin_data : array[0..13] of char;
+                 );
+         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;
+          wHighVersion : WORD;
+          szDescription : array[0..WSADESCRIPTION_LEN] of char;
+          szSystemStatus : array[0..WSASYS_STATUS_LEN] of char;
+          iMaxSockets : word;
+          iMaxUdpDg : word;
+          lpVendorInfo : pchar;
+       end;
+       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 = -1;
+       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 : plongint) : TSocket;stdcall;
+    function bind(s:TSocket; addr: PSockaddr;namelen:longint):longint;stdcall;
+    function closesocket(s:TSocket):longint;stdcall;
+    function connect(s:TSocket; var name:TSockAddr; namelen:longint):longint;stdcall;
+    function ioctlsocket(s:TSocket; cmd:longint; argp:pu_long):longint;stdcall;
+    function getpeername(s:TSocket; var name:TSockAddr;namelen:plongint):longint;stdcall;
+    function getsockname(s:TSocket; var name:TSockAddr; namelen:plongint):longint;stdcall;
+    function getsockopt(s:TSocket; level:longint; optname:longint; optval:pchar;var optlen:longint):longint;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:longint):longint;stdcall;
+    function ntohl(netlong:u_long):u_long;stdcall;
+    function ntohs(netshort:u_short):u_short;stdcall;
+    function recv(s:TSocket;var buf; len:longint; flags:longint):longint;stdcall;
+    function recvfrom(s:TSocket;var buf; len:longint; flags:longint;var from:TSockAddr; fromlen:plongint):longint;stdcall;
+    function select(nfds:longint; readfds,writefds,exceptfds : PFDSet;timeout: PTimeVal):longint;stdcall;
+    function send(s:TSocket;var buf; len:longint; flags:longint):longint;stdcall;
+    function sendto(s:TSocket; buf:pchar; len:longint; flags:longint;var toaddr:TSockAddr; tolen:longint):longint;stdcall;
+    function setsockopt(s:TSocket; level:longint; optname:longint; optval:pchar; optlen:longint):longint;stdcall;
+    function shutdown(s:TSocket; how:longint):longint;stdcall;
+    function socket(af:longint; t:longint; protocol:longint):TSocket;stdcall;
+
+    { Database function prototypes  }
+    function gethostbyaddr(addr:pchar; len:longint; t:longint): PHostEnt;stdcall;
+    function gethostbyname(name:pchar):PHostEnt;stdcall;
+    function gethostname(name:pchar; namelen:longint):longint;stdcall;
+    function getservbyport(port:longint; proto:pchar):PServEnt;stdcall;
+    function getservbyname(name:pchar; proto:pchar):PServEnt;stdcall;
+    function getprotobynumber(proto:longint):PProtoEnt;stdcall;
+    function getprotobyname(name:pchar):PProtoEnt;stdcall;
+ 
+    { Microsoft Windows Extension function prototypes  }
+    function WSAStartup(wVersionRequired:word;var WSAData:TWSADATA):longint;stdcall;
+    function WSACleanup:longint;stdcall;
+    procedure WSASetLastError(iError:longint);stdcall;
+    function WSAGetLastError:longint;stdcall;
+    function WSAIsBlocking:BOOL;stdcall;
+    function WSAUnhookBlockingHook:longint;stdcall;
+    function WSASetBlockingHook(lpBlockFunc:TFarProc):TFarProc;stdcall;
+    function WSACancelBlockingCall:longint;stdcall;
+    function WSAAsyncGetServByName(hWnd:HWND; wMsg:u_int; name:pchar; proto:pchar; buf:pchar; 
+                                   buflen:longint):THandle;stdcall;
+    function WSAAsyncGetServByPort(hWnd:HWND; wMsg:u_int; port:longint; proto:pchar; buf:pchar; 
+                                   buflen:longint):THandle;stdcall;
+    function WSAAsyncGetProtoByName(hWnd:HWND; wMsg:u_int; name:pchar; buf:pchar; buflen:longint):THandle;stdcall;
+    function WSAAsyncGetProtoByNumber(hWnd:HWND; wMsg:u_int; number:longint; buf:pchar; buflen:longint):THandle;stdcall;
+    function WSAAsyncGetHostByName(hWnd:HWND; wMsg:u_int; name:pchar; buf:pchar; buflen:longint):THandle;stdcall;
+    function WSAAsyncGetHostByAddr(hWnd:HWND; wMsg:u_int; addr:pchar; len:longint; t:longint; 
+                                   buf:pchar; buflen:longint):THandle;stdcall;
+    function WSACancelAsyncRequest(hAsyncTaskHandle:THandle):longint;stdcall;
+    function WSAAsyncSelect(s:TSocket; hWnd:HWND; wMsg:u_int; lEvent:longint):longint;stdcall;
+    function WSARecvEx(s:TSocket;var buf; len:longint; flags:plongint):longint;stdcall;
+
+    { the following stuff was missed in my sockets.h (FK) }
+    function __WSAFDIsSet(s:TSocket; var FDSet:TFDSet):Bool;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:Integer;
+                                   var RemoteSockaddr:TSockAddr; var RemoteSockaddrLength:Integer);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 : plongint) : TSocket;stdcall;external winsockdll name 'accept';
+    function bind(s:TSocket; addr: PSockaddr;namelen:longint):longint;stdcall;external winsockdll name 'bind';
+    function closesocket(s:TSocket):longint;stdcall;external winsockdll name 'closesocket';
+    function connect(s:TSocket; var name:TSockAddr; namelen:longint):longint;stdcall;external winsockdll name 'connect';
+    function ioctlsocket(s:TSocket; cmd:longint; argp:pu_long):longint;stdcall;external winsockdll name 'ioctlsocket';
+    function getpeername(s:TSocket; var name:TSockAddr;namelen:plongint):longint;stdcall;
+      external winsockdll name 'getpeername';
+    function getsockname(s:TSocket; var name:TSockAddr; namelen:plongint):longint;stdcall;
+      external winsockdll name 'getsockname';
+    function getsockopt(s:TSocket; level:longint; optname:longint; optval:pchar;var optlen:longint):longint;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:longint):longint;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:longint; flags:longint):longint;stdcall;external winsockdll name 'recv';
+    function recvfrom(s:TSocket;var buf; len:longint; flags:longint;var from:TSockAddr; fromlen:plongint):longint;stdcall;
+      external winsockdll name 'recvfrom'; 
+    function select(nfds:longint; readfds,writefds,exceptfds : PFDSet;timeout: PTimeVal):longint;stdcall;
+      external winsockdll name 'select';
+    function send(s:TSocket;var buf; len:longint; flags:longint):longint;stdcall;
+      external winsockdll name 'send';
+    function sendto(s:TSocket; buf:pchar; len:longint; flags:longint;var toaddr:TSockAddr; tolen:longint):longint;stdcall;
+      external winsockdll name 'sendto';
+    function setsockopt(s:TSocket; level:longint; optname:longint; optval:pchar; optlen:longint):longint;stdcall;
+      external winsockdll name 'setsockopt';
+    function shutdown(s:TSocket; how:longint):longint;stdcall;
+      external winsockdll name 'shutdown';
+    function socket(af:longint; t:longint; protocol:longint):TSocket;stdcall;
+      external winsockdll name 'socket';
+
+    { Database function prototypes  }
+    function gethostbyaddr(addr:pchar; len:longint; t:longint): PHostEnt;stdcall;external winsockdll name 'gethostbyaddr';
+    function gethostbyname(name:pchar):PHostEnt;stdcall;external winsockdll name 'gethostbyname';
+    function gethostname(name:pchar; namelen:longint):longint;stdcall;external winsockdll name 'gethostname';
+    function getservbyport(port:longint; proto:pchar):PServEnt;stdcall;external winsockdll name 'getservbyport';
+    function getservbyname(name:pchar; proto:pchar):PServEnt;stdcall;external winsockdll name 'getservbyname';
+    function getprotobynumber(proto:longint):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):longint;stdcall;
+      external winsockdll name 'WSAAsyncSelect';
+    function WSACleanup:longint;stdcall;external winsockdll name 'WSACleanup';
+    procedure WSASetLastError(iError:longint);stdcall;external winsockdll name 'WSASetLastError';
+    function WSAGetLastError:longint;stdcall;external winsockdll name 'WSAGetLastError';
+    function WSAIsBlocking:BOOL;stdcall;external winsockdll name 'WSAIsBlocking';
+    function WSAUnhookBlockingHook:longint;stdcall;external winsockdll name 'WSAUnhookBlockingHook';
+    function WSASetBlockingHook(lpBlockFunc:TFarProc):TFarProc;stdcall;external winsockdll name 'WSASetBlockingHook';
+    function WSACancelBlockingCall:longint;stdcall;external winsockdll name 'WSACancelBlockingCall';
+    function WSAAsyncGetServByName(hWnd:HWND; wMsg:u_int; name:pchar; proto:pchar; buf:pchar; 
+                                   buflen:longint):THandle;stdcall;external winsockdll name 'WSAAsyncGetServByName';
+    function WSAAsyncGetServByPort(hWnd:HWND; wMsg:u_int; port:longint; proto:pchar; buf:pchar; 
+                                   buflen:longint):THandle;stdcall;external winsockdll name 'WSAAsyncGetServByPort';
+    function WSAAsyncGetProtoByName(hWnd:HWND; wMsg:u_int; name:pchar; buf:pchar; buflen:longint):THandle;stdcall;
+      external winsockdll name 'WSAAsyncGetProtoByName';
+    function WSAAsyncGetProtoByNumber(hWnd:HWND; wMsg:u_int; number:longint; buf:pchar; buflen:longint):THandle;stdcall;
+      external winsockdll name 'WSAAsyncGetProtoByNumber';
+    function WSAAsyncGetHostByName(hWnd:HWND; wMsg:u_int; name:pchar; buf:pchar; buflen:longint):THandle;stdcall;
+      external winsockdll name 'WSAAsyncGetHostByName';
+    function WSAAsyncGetHostByAddr(hWnd:HWND; wMsg:u_int; addr:pchar; len:longint; t:longint; 
+                                   buf:pchar; buflen:longint):THandle;stdcall;
+                                   external winsockdll name 'WSAAsyncGetHostByAddr';      
+    function WSACancelAsyncRequest(hAsyncTaskHandle:THandle):longint;stdcall; 
+      external winsockdll name 'WSACancelAsyncRequest';
+    function WSAAsyncSelect(s:TSocket; hWnd:HWND; wMsg:u_int; lEvent:longint):longint;stdcall;
+      external winsockdll name 'WSAAsyncSelect';
+    function WSARecvEx(s:TSocket;var buf; len:longint; flags:plongint):longint;stdcall;
+      external winsockdll name 'WSARecvEx';
+    function __WSAFDIsSet(s:TSocket; var FDSet:TFDSet):Bool;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:Integer;
+                                   var RemoteSockaddr:TSockAddr; var RemoteSockaddrLength:Integer);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 : longint;
+
+      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.1  1999-06-18 13:58:59  florian
+    + initial revision, should be completly compatible with the delphi
+      winsock unit
+
+}