home *** CD-ROM | disk | FTP | other *** search
/ PC World Plus! (NZ) 2001 June / HDC50.iso / Runimage / Delphi50 / Source / Rtl / Win / WINSOCK.PAS < prev    next >
Pascal/Delphi Source File  |  1999-08-11  |  39KB  |  1,153 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Borland Delphi Runtime Library                  }
  5. {       Win32 sockets API Interface Unit                }
  6. {                                                       }
  7. {       Copyright (C) 1996,99 Inprise Corporation       }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11. unit WinSock;
  12.  
  13. {$WEAKPACKAGEUNIT}
  14.  
  15. interface
  16.  
  17. uses Windows;
  18.  
  19. { HPPEMIT '#include <windows.h>'}
  20.  
  21. type
  22.   {$EXTERNALSYM u_char}
  23.   u_char = Char;
  24.   {$EXTERNALSYM u_short}
  25.   u_short = Word;
  26.   {$EXTERNALSYM u_int}
  27.   u_int = Integer;
  28.   {$EXTERNALSYM u_long}
  29.   u_long = Longint;
  30.  
  31. { The new type to be used in all
  32.   instances which refer to sockets. }
  33.   {$EXTERNALSYM TSocket}
  34.   TSocket = u_int;
  35.  
  36. const
  37.   {$EXTERNALSYM FD_SETSIZE}
  38.   FD_SETSIZE     =   64;
  39.  
  40. type
  41. // the following emits are a workaround to the name conflict with
  42. // procedure FD_SET and struct fd_set in winsock.h
  43. (*$HPPEMIT '#include <winsock.h>'*)
  44. (*$HPPEMIT 'namespace Winsock'*)
  45. (*$HPPEMIT '{'*)
  46. (*$HPPEMIT 'typedef fd_set *PFDSet;'*) // due to name conflict with procedure FD_SET
  47. (*$HPPEMIT 'typedef fd_set TFDSet;'*)  // due to name conflict with procedure FD_SET
  48. (*$HPPEMIT '}'*)
  49.  
  50.   {$NODEFINE PFDSet}
  51.   PFDSet = ^TFDSet;
  52.   {$NODEFINE TFDSet}
  53.   TFDSet = record
  54.     fd_count: u_int;
  55.     fd_array: array[0..FD_SETSIZE-1] of TSocket;
  56.   end;
  57.  
  58.   PTimeVal = ^TTimeVal;
  59.   {$EXTERNALSYM timeval}
  60.   timeval = record
  61.     tv_sec: Longint;
  62.     tv_usec: Longint;
  63.   end;
  64.   TTimeVal = timeval;
  65.  
  66. const
  67.   {$EXTERNALSYM IOCPARM_MASK}
  68.   IOCPARM_MASK = $7f;
  69.   {$EXTERNALSYM IOC_VOID}
  70.   IOC_VOID     = $20000000;
  71.   {$EXTERNALSYM IOC_OUT}
  72.   IOC_OUT      = $40000000;
  73.   {$EXTERNALSYM IOC_IN}
  74.   IOC_IN       = $80000000;
  75.   {$EXTERNALSYM IOC_INOUT}
  76.   IOC_INOUT    = (IOC_IN or IOC_OUT);
  77.  
  78.   {$EXTERNALSYM FIONREAD}
  79.   FIONREAD     = IOC_OUT or { get # bytes to read }
  80.     ((Longint(SizeOf(Longint)) and IOCPARM_MASK) shl 16) or
  81.     (Longint(Byte('f')) shl 8) or 127;
  82.   {$EXTERNALSYM FIONBIO}
  83.   FIONBIO      = IOC_IN or { set/clear non-blocking i/o }
  84.     ((Longint(SizeOf(Longint)) and IOCPARM_MASK) shl 16) or
  85.     (Longint(Byte('f')) shl 8) or 126;
  86.   {$EXTERNALSYM FIOASYNC}
  87.   FIOASYNC     = IOC_IN or { set/clear async i/o }
  88.     ((Longint(SizeOf(Longint)) and IOCPARM_MASK) shl 16) or
  89.     (Longint(Byte('f')) shl 8) or 125;
  90.  
  91. type
  92.   PHostEnt = ^THostEnt;
  93.   {$EXTERNALSYM hostent}
  94.   hostent = record
  95.     h_name: PChar;
  96.     h_aliases: ^PChar;
  97.     h_addrtype: Smallint;
  98.     h_length: Smallint;
  99.     case Byte of
  100.       0: (h_addr_list: ^PChar);
  101.       1: (h_addr: ^PChar)
  102.   end;
  103.   THostEnt = hostent;
  104.  
  105.   PNetEnt = ^TNetEnt;
  106.   {$EXTERNALSYM netent}
  107.   netent = record
  108.     n_name: PChar;
  109.     n_aliases: ^PChar;
  110.     n_addrtype: Smallint;
  111.     n_net: u_long;
  112.   end;
  113.   TNetEnt = netent;
  114.  
  115.   PServEnt = ^TServEnt;
  116.   {$EXTERNALSYM servent}
  117.   servent = record
  118.     s_name: PChar;
  119.     s_aliases: ^PChar;
  120.     s_port: Word;
  121.     s_proto: PChar;
  122.   end;
  123.   TServEnt = servent;
  124.  
  125.   PProtoEnt = ^TProtoEnt;
  126.   {$EXTERNALSYM protoent}
  127.   protoent = record
  128.     p_name: PChar;
  129.     p_aliases: ^Pchar;
  130.     p_proto: Smallint;
  131.   end;
  132.   TProtoEnt = protoent;
  133.  
  134. const
  135.  
  136. { Protocols }
  137.  
  138.   {$EXTERNALSYM IPPROTO_IP}
  139.   IPPROTO_IP     =   0;             { dummy for IP }
  140.   {$EXTERNALSYM IPPROTO_ICMP}
  141.   IPPROTO_ICMP   =   1;             { control message protocol }
  142.   {$EXTERNALSYM IPPROTO_IGMP}
  143.   IPPROTO_IGMP   =   2;             { group management protocol }
  144.   {$EXTERNALSYM IPPROTO_GGP}
  145.   IPPROTO_GGP    =   3;             { gateway^2 (deprecated) }
  146.   {$EXTERNALSYM IPPROTO_TCP}
  147.   IPPROTO_TCP    =   6;             { tcp }
  148.   {$EXTERNALSYM IPPROTO_PUP}
  149.   IPPROTO_PUP    =  12;             { pup }
  150.   {$EXTERNALSYM IPPROTO_UDP}
  151.   IPPROTO_UDP    =  17;             { user datagram protocol }
  152.   {$EXTERNALSYM IPPROTO_IDP}
  153.   IPPROTO_IDP    =  22;             { xns idp }
  154.   {$EXTERNALSYM IPPROTO_ND}
  155.   IPPROTO_ND     =  77;             { UNOFFICIAL net disk proto }
  156.  
  157.   {$EXTERNALSYM IPPROTO_RAW}
  158.   IPPROTO_RAW    =  255;            { raw IP packet }
  159.   {$EXTERNALSYM IPPROTO_MAX}
  160.   IPPROTO_MAX    =  256;
  161.  
  162. { Port/socket numbers: network standard functions}
  163.  
  164.   {$EXTERNALSYM IPPORT_ECHO}
  165.   IPPORT_ECHO    =   7;
  166.   {$EXTERNALSYM IPPORT_DISCARD}
  167.   IPPORT_DISCARD =   9;
  168.   {$EXTERNALSYM IPPORT_SYSTAT}
  169.   IPPORT_SYSTAT  =   11;
  170.   {$EXTERNALSYM IPPORT_DAYTIME}
  171.   IPPORT_DAYTIME =   13;
  172.   {$EXTERNALSYM IPPORT_NETSTAT}
  173.   IPPORT_NETSTAT =   15;
  174.   {$EXTERNALSYM IPPORT_FTP}
  175.   IPPORT_FTP     =   21;
  176.   {$EXTERNALSYM IPPORT_TELNET}
  177.   IPPORT_TELNET  =   23;
  178.   {$EXTERNALSYM IPPORT_SMTP}
  179.   IPPORT_SMTP    =   25;
  180.   {$EXTERNALSYM IPPORT_TIMESERVER}
  181.   IPPORT_TIMESERVER  =  37;
  182.   {$EXTERNALSYM IPPORT_NAMESERVER}
  183.   IPPORT_NAMESERVER  =  42;
  184.   {$EXTERNALSYM IPPORT_WHOIS}
  185.   IPPORT_WHOIS       =  43;
  186.   {$EXTERNALSYM IPPORT_MTP}
  187.   IPPORT_MTP         =  57;
  188.  
  189. { Port/socket numbers: host specific functions }
  190.  
  191.   {$EXTERNALSYM IPPORT_TFTP}
  192.   IPPORT_TFTP        =  69;
  193.   {$EXTERNALSYM IPPORT_RJE}
  194.   IPPORT_RJE         =  77;
  195.   {$EXTERNALSYM IPPORT_FINGER}
  196.   IPPORT_FINGER      =  79;
  197.   {$EXTERNALSYM IPPORT_TTYLINK}
  198.   IPPORT_TTYLINK     =  87;
  199.   {$EXTERNALSYM IPPORT_SUPDUP}
  200.   IPPORT_SUPDUP      =  95;
  201.  
  202. { UNIX TCP sockets }
  203.  
  204.   {$EXTERNALSYM IPPORT_EXECSERVER}
  205.   IPPORT_EXECSERVER  =  512;
  206.   {$EXTERNALSYM IPPORT_LOGINSERVER}
  207.   IPPORT_LOGINSERVER =  513;
  208.   {$EXTERNALSYM IPPORT_CMDSERVER}
  209.   IPPORT_CMDSERVER   =  514;
  210.   {$EXTERNALSYM IPPORT_EFSSERVER}
  211.   IPPORT_EFSSERVER   =  520;
  212.  
  213. { UNIX UDP sockets }
  214.  
  215.   {$EXTERNALSYM IPPORT_BIFFUDP}
  216.   IPPORT_BIFFUDP     =  512;
  217.   {$EXTERNALSYM IPPORT_WHOSERVER}
  218.   IPPORT_WHOSERVER   =  513;
  219.   {$EXTERNALSYM IPPORT_ROUTESERVER}
  220.   IPPORT_ROUTESERVER =  520;
  221.  
  222. { Ports < IPPORT_RESERVED are reserved for
  223.   privileged processes (e.g. root). }
  224.  
  225.   {$EXTERNALSYM IPPORT_RESERVED}
  226.   IPPORT_RESERVED    =  1024;
  227.  
  228. { Link numbers }
  229.  
  230.   {$EXTERNALSYM IMPLINK_IP}
  231.   IMPLINK_IP         =  155;
  232.   {$EXTERNALSYM IMPLINK_LOWEXPER}
  233.   IMPLINK_LOWEXPER   =  156;
  234.   {$EXTERNALSYM IMPLINK_HIGHEXPER}
  235.   IMPLINK_HIGHEXPER  =  158;
  236.  
  237. type
  238.   {$EXTERNALSYM SunB}
  239.   SunB = packed record
  240.     s_b1, s_b2, s_b3, s_b4: u_char;
  241.   end;
  242.  
  243.   {$EXTERNALSYM SunW}
  244.   SunW = packed record
  245.     s_w1, s_w2: u_short;
  246.   end;
  247.  
  248.   PInAddr = ^TInAddr;
  249.   {$EXTERNALSYM in_addr}
  250.   in_addr = record
  251.     case integer of
  252.       0: (S_un_b: SunB);
  253.       1: (S_un_w: SunW);
  254.       2: (S_addr: u_long);
  255.   end;
  256.   TInAddr = in_addr;
  257.  
  258.   PSockAddrIn = ^TSockAddrIn;
  259.   {$EXTERNALSYM sockaddr_in}
  260.   sockaddr_in = record
  261.     case Integer of
  262.       0: (sin_family: u_short;
  263.           sin_port: u_short;
  264.           sin_addr: TInAddr;
  265.           sin_zero: array[0..7] of Char);
  266.       1: (sa_family: u_short;
  267.           sa_data: array[0..13] of Char)
  268.   end;
  269.   TSockAddrIn = sockaddr_in;
  270.  
  271. const
  272.   {$EXTERNALSYM INADDR_ANY}
  273.   INADDR_ANY       = $00000000;
  274.   {$EXTERNALSYM INADDR_LOOPBACK}
  275.   INADDR_LOOPBACK  = $7F000001;
  276.   {$EXTERNALSYM INADDR_BROADCAST}
  277.   INADDR_BROADCAST = $FFFFFFFF;
  278.   {$EXTERNALSYM INADDR_NONE}
  279.   INADDR_NONE      = $FFFFFFFF;
  280.  
  281.   {$EXTERNALSYM WSADESCRIPTION_LEN}
  282.   WSADESCRIPTION_LEN     =   256;
  283.   {$EXTERNALSYM WSASYS_STATUS_LEN}
  284.   WSASYS_STATUS_LEN      =   128;
  285.  
  286. type
  287.   PWSAData = ^TWSAData;
  288.   {$EXTERNALSYM WSAData}
  289.   WSAData = record // !!! also WSDATA
  290.     wVersion: Word;
  291.     wHighVersion: Word;
  292.     szDescription: array[0..WSADESCRIPTION_LEN] of Char;
  293.     szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char;
  294.     iMaxSockets: Word;
  295.     iMaxUdpDg: Word;
  296.     lpVendorInfo: PChar;
  297.   end;
  298.   TWSAData = WSAData;
  299.  
  300.   PTransmitFileBuffers = ^TTransmitFileBuffers;
  301.   {$EXTERNALSYM _TRANSMIT_FILE_BUFFERS}
  302.   _TRANSMIT_FILE_BUFFERS = record
  303.       Head: Pointer;
  304.       HeadLength: DWORD;
  305.       Tail: Pointer;
  306.       TailLength: DWORD;
  307.   end;
  308.   TTransmitFileBuffers = _TRANSMIT_FILE_BUFFERS;
  309.   {$EXTERNALSYM TRANSMIT_FILE_BUFFERS}
  310.   TRANSMIT_FILE_BUFFERS = _TRANSMIT_FILE_BUFFERS;
  311.  
  312.  
  313. const
  314.   {$EXTERNALSYM TF_DISCONNECT}
  315.   TF_DISCONNECT           = $01;
  316.   {$EXTERNALSYM TF_REUSE_SOCKET}
  317.   TF_REUSE_SOCKET         = $02;
  318.   {$EXTERNALSYM TF_WRITE_BEHIND}
  319.   TF_WRITE_BEHIND         = $04;
  320.  
  321. { Options for use with [gs]etsockopt at the IP level. }
  322.  
  323.   {$EXTERNALSYM IP_OPTIONS}
  324.   IP_OPTIONS          = 1;
  325.   {$EXTERNALSYM IP_MULTICAST_IF}
  326.   IP_MULTICAST_IF     = 2;           { set/get IP multicast interface   }
  327.   {$EXTERNALSYM IP_MULTICAST_TTL}
  328.   IP_MULTICAST_TTL    = 3;           { set/get IP multicast timetolive  }
  329.   {$EXTERNALSYM IP_MULTICAST_LOOP}
  330.   IP_MULTICAST_LOOP   = 4;           { set/get IP multicast loopback    }
  331.   {$EXTERNALSYM IP_ADD_MEMBERSHIP}
  332.   IP_ADD_MEMBERSHIP   = 5;           { add  an IP group membership      }
  333.   {$EXTERNALSYM IP_DROP_MEMBERSHIP}
  334.   IP_DROP_MEMBERSHIP  = 6;           { drop an IP group membership      }
  335.   {$EXTERNALSYM IP_TTL}
  336.   IP_TTL              = 7;           { set/get IP Time To Live          }
  337.   {$EXTERNALSYM IP_TOS}
  338.   IP_TOS              = 8;           { set/get IP Type Of Service       }
  339.   {$EXTERNALSYM IP_DONTFRAGMENT}
  340.   IP_DONTFRAGMENT     = 9;           { set/get IP Don't Fragment flag   }
  341.  
  342.  
  343.   {$EXTERNALSYM IP_DEFAULT_MULTICAST_TTL}
  344.   IP_DEFAULT_MULTICAST_TTL   = 1;    { normally limit m'casts to 1 hop  }
  345.   {$EXTERNALSYM IP_DEFAULT_MULTICAST_LOOP}
  346.   IP_DEFAULT_MULTICAST_LOOP  = 1;    { normally hear sends if a member  }
  347.   {$EXTERNALSYM IP_MAX_MEMBERSHIPS}
  348.   IP_MAX_MEMBERSHIPS         = 20;   { per socket; must fit in one mbuf }
  349.  
  350. { This is used instead of -1, since the
  351.   TSocket type is unsigned.}
  352.  
  353.   {$EXTERNALSYM INVALID_SOCKET    =}
  354.   INVALID_SOCKET        = TSocket(NOT(0));
  355.   {$EXTERNALSYM SOCKET_ERROR      =}
  356.   SOCKET_ERROR            = -1;
  357.  
  358. { Types }
  359.  
  360.   {$EXTERNALSYM SOCK_STREAM}
  361.   SOCK_STREAM     = 1;               { stream socket }
  362.   {$EXTERNALSYM SOCK_DGRAM}
  363.   SOCK_DGRAM      = 2;               { datagram socket }
  364.   {$EXTERNALSYM SOCK_RAW}
  365.   SOCK_RAW        = 3;               { raw-protocol interface }
  366.   {$EXTERNALSYM SOCK_RDM}
  367.   SOCK_RDM        = 4;               { reliably-delivered message }
  368.   {$EXTERNALSYM SOCK_SEQPACKET}
  369.   SOCK_SEQPACKET  = 5;               { sequenced packet stream }
  370.  
  371. { Option flags per-socket. }
  372.  
  373.   {$EXTERNALSYM SO_DEBUG}
  374.   SO_DEBUG        = $0001;          { turn on debugging info recording }
  375.   {$EXTERNALSYM SO_ACCEPTCONN}
  376.   SO_ACCEPTCONN   = $0002;          { socket has had listen() }
  377.   {$EXTERNALSYM SO_REUSEADDR}
  378.   SO_REUSEADDR    = $0004;          { allow local address reuse }
  379.   {$EXTERNALSYM SO_KEEPALIVE}
  380.   SO_KEEPALIVE    = $0008;          { keep connections alive }
  381.   {$EXTERNALSYM SO_DONTROUTE}
  382.   SO_DONTROUTE    = $0010;          { just use interface addresses }
  383.   {$EXTERNALSYM SO_BROADCAST}
  384.   SO_BROADCAST    = $0020;          { permit sending of broadcast msgs }
  385.   {$EXTERNALSYM SO_USELOOPBACK}
  386.   SO_USELOOPBACK  = $0040;          { bypass hardware when possible }
  387.   {$EXTERNALSYM SO_LINGER}
  388.   SO_LINGER       = $0080;          { linger on close if data present }
  389.   {$EXTERNALSYM SO_OOBINLINE}
  390.   SO_OOBINLINE    = $0100;          { leave received OOB data in line }
  391.  
  392.   {$EXTERNALSYM SO_DONTLINGER}
  393.   SO_DONTLINGER  =   $ff7f;
  394.  
  395. { Additional options. }
  396.  
  397.   {$EXTERNALSYM SO_SNDBUF}
  398.   SO_SNDBUF       = $1001;          { send buffer size }
  399.   {$EXTERNALSYM SO_RCVBUF}
  400.   SO_RCVBUF       = $1002;          { receive buffer size }
  401.   {$EXTERNALSYM SO_SNDLOWAT}
  402.   SO_SNDLOWAT     = $1003;          { send low-water mark }
  403.   {$EXTERNALSYM SO_RCVLOWAT}
  404.   SO_RCVLOWAT     = $1004;          { receive low-water mark }
  405.   {$EXTERNALSYM SO_SNDTIMEO}
  406.   SO_SNDTIMEO     = $1005;          { send timeout }
  407.   {$EXTERNALSYM SO_RCVTIMEO}
  408.   SO_RCVTIMEO     = $1006;          { receive timeout }
  409.   {$EXTERNALSYM SO_ERROR}
  410.   SO_ERROR        = $1007;          { get error status and clear }
  411.   {$EXTERNALSYM SO_TYPE}
  412.   SO_TYPE         = $1008;          { get socket type }
  413.  
  414. { Options for connect and disconnect data and options.  Used only by
  415.   non-TCP/IP transports such as DECNet, OSI TP4, etc. }
  416.  
  417.   {$EXTERNALSYM SO_CONNDATA}
  418.   SO_CONNDATA     = $7000;
  419.   {$EXTERNALSYM SO_CONNOPT}
  420.   SO_CONNOPT      = $7001;
  421.   {$EXTERNALSYM SO_DISCDATA}
  422.   SO_DISCDATA     = $7002;
  423.   {$EXTERNALSYM SO_DISCOPT}
  424.   SO_DISCOPT      = $7003;
  425.   {$EXTERNALSYM SO_CONNDATALEN}
  426.   SO_CONNDATALEN  = $7004;
  427.   {$EXTERNALSYM SO_CONNOPTLEN}
  428.   SO_CONNOPTLEN   = $7005;
  429.   {$EXTERNALSYM SO_DISCDATALEN}
  430.   SO_DISCDATALEN  = $7006;
  431.   {$EXTERNALSYM SO_DISCOPTLEN}
  432.   SO_DISCOPTLEN   = $7007;
  433.  
  434. { Option for opening sockets for synchronous access. }
  435.  
  436.   {$EXTERNALSYM SO_OPENTYPE}
  437.   SO_OPENTYPE     = $7008;
  438.  
  439.   {$EXTERNALSYM SO_SYNCHRONOUS_ALERT}
  440.   SO_SYNCHRONOUS_ALERT    = $10;
  441.   {$EXTERNALSYM SO_SYNCHRONOUS_NONALERT}
  442.   SO_SYNCHRONOUS_NONALERT = $20;
  443.  
  444. { Other NT-specific options. }
  445.  
  446.   {$EXTERNALSYM SO_MAXDG}
  447.   SO_MAXDG        = $7009;
  448.   {$EXTERNALSYM SO_MAXPATHDG}
  449.   SO_MAXPATHDG    = $700A;
  450.   {$EXTERNALSYM SO_UPDATE_ACCEPT_CONTEXT}
  451.   SO_UPDATE_ACCEPT_CONTEXT     = $700B;
  452.   {$EXTERNALSYM SO_CONNECT_TIME}
  453.   SO_CONNECT_TIME = $700C;
  454.  
  455. { TCP options. }
  456.  
  457.   {$EXTERNALSYM TCP_NODELAY}
  458.   TCP_NODELAY     = $0001;
  459.   {$EXTERNALSYM TCP_BSDURGENT}
  460.   TCP_BSDURGENT   = $7000;
  461.  
  462. { Address families. }
  463.  
  464.   {$EXTERNALSYM AF_UNSPEC}
  465.   AF_UNSPEC       = 0;               { unspecified }
  466.   {$EXTERNALSYM AF_UNIX}
  467.   AF_UNIX         = 1;               { local to host (pipes, portals) }
  468.   {$EXTERNALSYM AF_INET}
  469.   AF_INET         = 2;               { internetwork: UDP, TCP, etc. }
  470.   {$EXTERNALSYM AF_IMPLINK}
  471.   AF_IMPLINK      = 3;               { arpanet imp addresses }
  472.   {$EXTERNALSYM AF_PUP}
  473.   AF_PUP          = 4;               { pup protocols: e.g. BSP }
  474.   {$EXTERNALSYM AF_CHAOS}
  475.   AF_CHAOS        = 5;               { mit CHAOS protocols }
  476.   {$EXTERNALSYM AF_IPX}
  477.   AF_IPX          = 6;               { IPX and SPX }
  478.   {$EXTERNALSYM AF_NS}
  479.   AF_NS           = 6;               { XEROX NS protocols }
  480.   {$EXTERNALSYM AF_ISO}
  481.   AF_ISO          = 7;               { ISO protocols }
  482.   {$EXTERNALSYM AF_OSI}
  483.   AF_OSI          = AF_ISO;          { OSI is ISO }
  484.   {$EXTERNALSYM AF_ECMA}
  485.   AF_ECMA         = 8;               { european computer manufacturers }
  486.   {$EXTERNALSYM AF_DATAKIT}
  487.   AF_DATAKIT      = 9;               { datakit protocols }
  488.   {$EXTERNALSYM AF_CCITT}
  489.   AF_CCITT        = 10;              { CCITT protocols, X.25 etc }
  490.   {$EXTERNALSYM AF_SNA}
  491.   AF_SNA          = 11;              { IBM SNA }
  492.   {$EXTERNALSYM AF_DECnet}
  493.   AF_DECnet       = 12;              { DECnet }
  494.   {$EXTERNALSYM AF_DLI}
  495.   AF_DLI          = 13;              { Direct data link interface }
  496.   {$EXTERNALSYM AF_LAT}
  497.   AF_LAT          = 14;              { LAT }
  498.   {$EXTERNALSYM AF_HYLINK}
  499.   AF_HYLINK       = 15;              { NSC Hyperchannel }
  500.   {$EXTERNALSYM AF_APPLETALK}
  501.   AF_APPLETALK    = 16;              { AppleTalk }
  502.   {$EXTERNALSYM AF_NETBIOS}
  503.   AF_NETBIOS      = 17;              { NetBios-style addresses }
  504.   {$EXTERNALSYM AF_VOICEVIEW}
  505.   AF_VOICEVIEW    = 18;              { VoiceView }
  506.   {$EXTERNALSYM AF_FIREFOX}
  507.   AF_FIREFOX      = 19;              { FireFox }
  508.   {$EXTERNALSYM AF_UNKNOWN1}
  509.   AF_UNKNOWN1     = 20;              { Somebody is using this! }
  510.   {$EXTERNALSYM AF_BAN}
  511.   AF_BAN          = 21;              { Banyan }
  512.  
  513.   {$EXTERNALSYM AF_MAX}
  514.   AF_MAX          = 22;
  515.  
  516. type
  517.   { Structure used by kernel to store most addresses. }
  518.  
  519.   {$EXTERNALSYM PSOCKADDR}
  520.   PSOCKADDR = ^TSockAddr;
  521.   {$EXTERNALSYM TSockAddr}
  522.   TSockAddr = sockaddr_in;
  523.  
  524.  
  525.   { Structure used by kernel to pass protocol information in raw sockets. }
  526.   PSockProto = ^TSockProto;
  527.   {$EXTERNALSYM sockproto}
  528.   sockproto = record
  529.     sp_family: u_short;
  530.     sp_protocol: u_short;
  531.   end;
  532.   TSockProto = sockproto;
  533.  
  534. const
  535. { Protocol families, same as address families for now. }
  536.  
  537.   {$EXTERNALSYM PF_UNSPEC}
  538.   PF_UNSPEC       = AF_UNSPEC;
  539.   {$EXTERNALSYM PF_UNIX}
  540.   PF_UNIX         = AF_UNIX;
  541.   {$EXTERNALSYM PF_INET}
  542.   PF_INET         = AF_INET;
  543.   {$EXTERNALSYM PF_IMPLINK}
  544.   PF_IMPLINK      = AF_IMPLINK;
  545.   {$EXTERNALSYM PF_PUP}
  546.   PF_PUP          = AF_PUP;
  547.   {$EXTERNALSYM PF_CHAOS}
  548.   PF_CHAOS        = AF_CHAOS;
  549.   {$EXTERNALSYM PF_NS}
  550.   PF_NS           = AF_NS;
  551.   {$EXTERNALSYM PF_IPX}
  552.   PF_IPX          = AF_IPX;
  553.   {$EXTERNALSYM PF_ISO}
  554.   PF_ISO          = AF_ISO;
  555.   {$EXTERNALSYM PF_OSI}
  556.   PF_OSI          = AF_OSI;
  557.   {$EXTERNALSYM PF_ECMA}
  558.   PF_ECMA         = AF_ECMA;
  559.   {$EXTERNALSYM PF_DATAKIT}
  560.   PF_DATAKIT      = AF_DATAKIT;
  561.   {$EXTERNALSYM PF_CCITT}
  562.   PF_CCITT        = AF_CCITT;
  563.   {$EXTERNALSYM PF_SNA}
  564.   PF_SNA          = AF_SNA;
  565.   {$EXTERNALSYM PF_DECnet}
  566.   PF_DECnet       = AF_DECnet;
  567.   {$EXTERNALSYM PF_DLI}
  568.   PF_DLI          = AF_DLI;
  569.   {$EXTERNALSYM PF_LAT}
  570.   PF_LAT          = AF_LAT;
  571.   {$EXTERNALSYM PF_HYLINK}
  572.   PF_HYLINK       = AF_HYLINK;
  573.   {$EXTERNALSYM PF_APPLETALK}
  574.   PF_APPLETALK    = AF_APPLETALK;
  575.   {$EXTERNALSYM PF_VOICEVIEW}
  576.   PF_VOICEVIEW    = AF_VOICEVIEW;
  577.   {$EXTERNALSYM PF_FIREFOX}
  578.   PF_FIREFOX      = AF_FIREFOX;
  579.   {$EXTERNALSYM PF_UNKNOWN1}
  580.   PF_UNKNOWN1     = AF_UNKNOWN1;
  581.   {$EXTERNALSYM PF_BAN}
  582.   PF_BAN          = AF_BAN;
  583.  
  584.   {$EXTERNALSYM PF_MAX}
  585.   PF_MAX          = AF_MAX;
  586.  
  587. type
  588. { Structure used for manipulating linger option. }
  589.   PLinger = ^TLinger;
  590.   {$EXTERNALSYM linger}
  591.   linger = record
  592.     l_onoff: u_short;
  593.     l_linger: u_short;
  594.   end;
  595.   TLinger = linger;
  596.  
  597. const
  598. { Level number for (get/set)sockopt() to apply to socket itself. }
  599.  
  600.   {$EXTERNALSYM SOL_SOCKET}
  601.   SOL_SOCKET      = $ffff;          {options for socket level }
  602.  
  603. { Maximum queue length specifiable by listen. }
  604.  
  605.   {$EXTERNALSYM SOMAXCONN}
  606.   SOMAXCONN       = 5;
  607.  
  608.   {$EXTERNALSYM MSG_OOB}
  609.   MSG_OOB         = $1;             {process out-of-band data }
  610.   {$EXTERNALSYM MSG_PEEK}
  611.   MSG_PEEK        = $2;             {peek at incoming message }
  612.   {$EXTERNALSYM MSG_DONTROUTE}
  613.   MSG_DONTROUTE   = $4;             {send without using routing tables }
  614.  
  615.   {$EXTERNALSYM MSG_MAXIOVLEN}
  616.   MSG_MAXIOVLEN   = 16;
  617.  
  618.   {$EXTERNALSYM MSG_PARTIAL}
  619.   MSG_PARTIAL     = $8000;          {partial send or recv for message xport }
  620.  
  621. { Define constant based on rfc883, used by gethostbyxxxx() calls. }
  622.  
  623.   {$EXTERNALSYM MAXGETHOSTSTRUCT}
  624.   MAXGETHOSTSTRUCT        = 1024;
  625.  
  626. { Define flags to be used with the WSAAsyncSelect() call. }
  627.  
  628.   {$EXTERNALSYM FD_READ}
  629.   FD_READ         = $01;
  630.   {$EXTERNALSYM FD_WRITE}
  631.   FD_WRITE        = $02;
  632.   {$EXTERNALSYM FD_OOB}
  633.   FD_OOB          = $04;
  634.   {$EXTERNALSYM FD_ACCEPT}
  635.   FD_ACCEPT       = $08;
  636.   {$EXTERNALSYM FD_CONNECT}
  637.   FD_CONNECT      = $10;
  638.   {$EXTERNALSYM FD_CLOSE}
  639.   FD_CLOSE        = $20;
  640.  
  641. { All Windows Sockets error constants are biased by WSABASEERR from the "normal" }
  642.  
  643.   {$EXTERNALSYM WSABASEERR}
  644.   WSABASEERR              = 10000;
  645.  
  646. { Windows Sockets definitions of regular Microsoft C error constants }
  647.  
  648.   {$EXTERNALSYM WSAEINTR}
  649.   WSAEINTR                = (WSABASEERR+4);
  650.   {$EXTERNALSYM WSAEBADF}
  651.   WSAEBADF                = (WSABASEERR+9);
  652.   {$EXTERNALSYM WSAEACCES}
  653.   WSAEACCES               = (WSABASEERR+13);
  654.   {$EXTERNALSYM WSAEFAULT}
  655.   WSAEFAULT               = (WSABASEERR+14);
  656.   {$EXTERNALSYM WSAEINVAL}
  657.   WSAEINVAL               = (WSABASEERR+22);
  658.   {$EXTERNALSYM WSAEMFILE}
  659.   WSAEMFILE               = (WSABASEERR+24);
  660.  
  661. { Windows Sockets definitions of regular Berkeley error constants }
  662.  
  663.   {$EXTERNALSYM WSAEWOULDBLOCK}
  664.   WSAEWOULDBLOCK          = (WSABASEERR+35);
  665.   {$EXTERNALSYM WSAEINPROGRESS}
  666.   WSAEINPROGRESS          = (WSABASEERR+36);
  667.   {$EXTERNALSYM WSAEALREADY}
  668.   WSAEALREADY             = (WSABASEERR+37);
  669.   {$EXTERNALSYM WSAENOTSOCK}
  670.   WSAENOTSOCK             = (WSABASEERR+38);
  671.   {$EXTERNALSYM WSAEDESTADDRREQ}
  672.   WSAEDESTADDRREQ         = (WSABASEERR+39);
  673.   {$EXTERNALSYM WSAEMSGSIZE}
  674.   WSAEMSGSIZE             = (WSABASEERR+40);
  675.   {$EXTERNALSYM WSAEPROTOTYPE}
  676.   WSAEPROTOTYPE           = (WSABASEERR+41);
  677.   {$EXTERNALSYM WSAENOPROTOOPT}
  678.   WSAENOPROTOOPT          = (WSABASEERR+42);
  679.   {$EXTERNALSYM WSAEPROTONOSUPPORT}
  680.   WSAEPROTONOSUPPORT      = (WSABASEERR+43);
  681.   {$EXTERNALSYM WSAESOCKTNOSUPPORT}
  682.   WSAESOCKTNOSUPPORT      = (WSABASEERR+44);
  683.   {$EXTERNALSYM WSAEOPNOTSUPP}
  684.   WSAEOPNOTSUPP           = (WSABASEERR+45);
  685.   {$EXTERNALSYM WSAEPFNOSUPPORT}
  686.   WSAEPFNOSUPPORT         = (WSABASEERR+46);
  687.   {$EXTERNALSYM WSAEAFNOSUPPORT}
  688.   WSAEAFNOSUPPORT         = (WSABASEERR+47);
  689.   {$EXTERNALSYM WSAEADDRINUSE}
  690.   WSAEADDRINUSE           = (WSABASEERR+48);
  691.   {$EXTERNALSYM WSAEADDRNOTAVAIL}
  692.   WSAEADDRNOTAVAIL        = (WSABASEERR+49);
  693.   {$EXTERNALSYM WSAENETDOWN}
  694.   WSAENETDOWN             = (WSABASEERR+50);
  695.   {$EXTERNALSYM WSAENETUNREACH}
  696.   WSAENETUNREACH          = (WSABASEERR+51);
  697.   {$EXTERNALSYM WSAENETRESET}
  698.   WSAENETRESET            = (WSABASEERR+52);
  699.   {$EXTERNALSYM WSAECONNABORTED}
  700.   WSAECONNABORTED         = (WSABASEERR+53);
  701.   {$EXTERNALSYM WSAECONNRESET}
  702.   WSAECONNRESET           = (WSABASEERR+54);
  703.   {$EXTERNALSYM WSAENOBUFS}
  704.   WSAENOBUFS              = (WSABASEERR+55);
  705.   {$EXTERNALSYM WSAEISCONN}
  706.   WSAEISCONN              = (WSABASEERR+56);
  707.   {$EXTERNALSYM WSAENOTCONN}
  708.   WSAENOTCONN             = (WSABASEERR+57);
  709.   {$EXTERNALSYM WSAESHUTDOWN}
  710.   WSAESHUTDOWN            = (WSABASEERR+58);
  711.   {$EXTERNALSYM WSAETOOMANYREFS}
  712.   WSAETOOMANYREFS         = (WSABASEERR+59);
  713.   {$EXTERNALSYM WSAETIMEDOUT}
  714.   WSAETIMEDOUT            = (WSABASEERR+60);
  715.   {$EXTERNALSYM WSAECONNREFUSED}
  716.   WSAECONNREFUSED         = (WSABASEERR+61);
  717.   {$EXTERNALSYM WSAELOOP}
  718.   WSAELOOP                = (WSABASEERR+62);
  719.   {$EXTERNALSYM WSAENAMETOOLONG}
  720.   WSAENAMETOOLONG         = (WSABASEERR+63);
  721.   {$EXTERNALSYM WSAEHOSTDOWN}
  722.   WSAEHOSTDOWN            = (WSABASEERR+64);
  723.   {$EXTERNALSYM WSAEHOSTUNREACH}
  724.   WSAEHOSTUNREACH         = (WSABASEERR+65);
  725.   {$EXTERNALSYM WSAENOTEMPTY}
  726.   WSAENOTEMPTY            = (WSABASEERR+66);
  727.   {$EXTERNALSYM WSAEPROCLIM}
  728.   WSAEPROCLIM             = (WSABASEERR+67);
  729.   {$EXTERNALSYM WSAEUSERS}
  730.   WSAEUSERS               = (WSABASEERR+68);
  731.   {$EXTERNALSYM WSAEDQUOT}
  732.   WSAEDQUOT               = (WSABASEERR+69);
  733.   {$EXTERNALSYM WSAESTALE}
  734.   WSAESTALE               = (WSABASEERR+70);
  735.   {$EXTERNALSYM WSAEREMOTE}
  736.   WSAEREMOTE              = (WSABASEERR+71);
  737.  
  738.   {$EXTERNALSYM WSAEDISCON}
  739.   WSAEDISCON              = (WSABASEERR+101);
  740.  
  741. { Extended Windows Sockets error constant definitions }
  742.  
  743.   {$EXTERNALSYM WSASYSNOTREADY}
  744.   WSASYSNOTREADY          = (WSABASEERR+91);
  745.   {$EXTERNALSYM WSAVERNOTSUPPORTED}
  746.   WSAVERNOTSUPPORTED      = (WSABASEERR+92);
  747.   {$EXTERNALSYM WSANOTINITIALISED}
  748.   WSANOTINITIALISED       = (WSABASEERR+93);
  749.  
  750. { Error return codes from gethostbyname() and gethostbyaddr()
  751.   (when using the resolver). Note that these errors are
  752.   retrieved via WSAGetLastError() and must therefore follow
  753.   the rules for avoiding clashes with error numbers from
  754.   specific implementations or language run-time systems.
  755.   For this reason the codes are based at WSABASEERR+1001.
  756.   Note also that [WSA]NO_ADDRESS is defined only for
  757.   compatibility purposes. }
  758.  
  759. { Authoritative Answer: Host not found }
  760.  
  761.   {$EXTERNALSYM WSAHOST_NOT_FOUND}
  762.   WSAHOST_NOT_FOUND       = (WSABASEERR+1001);
  763.   {$EXTERNALSYM HOST_NOT_FOUND}
  764.   HOST_NOT_FOUND          = WSAHOST_NOT_FOUND;
  765.  
  766. { Non-Authoritative: Host not found, or SERVERFAIL }
  767.  
  768.   {$EXTERNALSYM WSATRY_AGAIN}
  769.   WSATRY_AGAIN            = (WSABASEERR+1002);
  770.   {$EXTERNALSYM TRY_AGAIN}
  771.   TRY_AGAIN               = WSATRY_AGAIN;
  772.  
  773. { Non recoverable errors, FORMERR, REFUSED, NOTIMP }
  774.  
  775.   {$EXTERNALSYM WSANO_RECOVERY}
  776.   WSANO_RECOVERY          = (WSABASEERR+1003);
  777.   {$EXTERNALSYM NO_RECOVERY}
  778.   NO_RECOVERY             = WSANO_RECOVERY;
  779.  
  780. { Valid name, no data record of requested type }
  781.  
  782.   {$EXTERNALSYM WSANO_DATA}
  783.   WSANO_DATA              = (WSABASEERR+1004);
  784.   {$EXTERNALSYM NO_DATA}
  785.   NO_DATA                 = WSANO_DATA;
  786.  
  787. { no address, look for MX record }
  788.  
  789.   {$EXTERNALSYM WSANO_ADDRESS}
  790.   WSANO_ADDRESS           = WSANO_DATA;
  791.   {$EXTERNALSYM NO_ADDRESS}
  792.   NO_ADDRESS              = WSANO_ADDRESS;
  793.  
  794. { Windows Sockets errors redefined as regular Berkeley error constants.
  795.   These are commented out in Windows NT to avoid conflicts with errno.h.
  796.   Use the WSA constants instead. }
  797.  
  798.   {$EXTERNALSYM EWOULDBLOCK}
  799.   EWOULDBLOCK        =  WSAEWOULDBLOCK;
  800.   {$EXTERNALSYM EINPROGRESS}
  801.   EINPROGRESS        =  WSAEINPROGRESS;
  802.   {$EXTERNALSYM EALREADY}
  803.   EALREADY           =  WSAEALREADY;
  804.   {$EXTERNALSYM ENOTSOCK}
  805.   ENOTSOCK           =  WSAENOTSOCK;
  806.   {$EXTERNALSYM EDESTADDRREQ}
  807.   EDESTADDRREQ       =  WSAEDESTADDRREQ;
  808.   {$EXTERNALSYM EMSGSIZE}
  809.   EMSGSIZE           =  WSAEMSGSIZE;
  810.   {$EXTERNALSYM EPROTOTYPE}
  811.   EPROTOTYPE         =  WSAEPROTOTYPE;
  812.   {$EXTERNALSYM ENOPROTOOPT}
  813.   ENOPROTOOPT        =  WSAENOPROTOOPT;
  814.   {$EXTERNALSYM EPROTONOSUPPORT}
  815.   EPROTONOSUPPORT    =  WSAEPROTONOSUPPORT;
  816.   {$EXTERNALSYM ESOCKTNOSUPPORT}
  817.   ESOCKTNOSUPPORT    =  WSAESOCKTNOSUPPORT;
  818.   {$EXTERNALSYM EOPNOTSUPP}
  819.   EOPNOTSUPP         =  WSAEOPNOTSUPP;
  820.   {$EXTERNALSYM EPFNOSUPPORT}
  821.   EPFNOSUPPORT       =  WSAEPFNOSUPPORT;
  822.   {$EXTERNALSYM EAFNOSUPPORT}
  823.   EAFNOSUPPORT       =  WSAEAFNOSUPPORT;
  824.   {$EXTERNALSYM EADDRINUSE}
  825.   EADDRINUSE         =  WSAEADDRINUSE;
  826.   {$EXTERNALSYM EADDRNOTAVAIL}
  827.   EADDRNOTAVAIL      =  WSAEADDRNOTAVAIL;
  828.   {$EXTERNALSYM ENETDOWN}
  829.   ENETDOWN           =  WSAENETDOWN;
  830.   {$EXTERNALSYM ENETUNREACH}
  831.   ENETUNREACH        =  WSAENETUNREACH;
  832.   {$EXTERNALSYM ENETRESET}
  833.   ENETRESET          =  WSAENETRESET;
  834.   {$EXTERNALSYM ECONNABORTED}
  835.   ECONNABORTED       =  WSAECONNABORTED;
  836.   {$EXTERNALSYM ECONNRESET}
  837.   ECONNRESET         =  WSAECONNRESET;
  838.   {$EXTERNALSYM ENOBUFS}
  839.   ENOBUFS            =  WSAENOBUFS;
  840.   {$EXTERNALSYM EISCONN}
  841.   EISCONN            =  WSAEISCONN;
  842.   {$EXTERNALSYM ENOTCONN}
  843.   ENOTCONN           =  WSAENOTCONN;
  844.   {$EXTERNALSYM ESHUTDOWN}
  845.   ESHUTDOWN          =  WSAESHUTDOWN;
  846.   {$EXTERNALSYM ETOOMANYREFS}
  847.   ETOOMANYREFS       =  WSAETOOMANYREFS;
  848.   {$EXTERNALSYM ETIMEDOUT}
  849.   ETIMEDOUT          =  WSAETIMEDOUT;
  850.   {$EXTERNALSYM ECONNREFUSED}
  851.   ECONNREFUSED       =  WSAECONNREFUSED;
  852.   {$EXTERNALSYM ELOOP}
  853.   ELOOP              =  WSAELOOP;
  854.   {$EXTERNALSYM ENAMETOOLONG}
  855.   ENAMETOOLONG       =  WSAENAMETOOLONG;
  856.   {$EXTERNALSYM EHOSTDOWN}
  857.   EHOSTDOWN          =  WSAEHOSTDOWN;
  858.   {$EXTERNALSYM EHOSTUNREACH}
  859.   EHOSTUNREACH       =  WSAEHOSTUNREACH;
  860.   {$EXTERNALSYM ENOTEMPTY}
  861.   ENOTEMPTY          =  WSAENOTEMPTY;
  862.   {$EXTERNALSYM EPROCLIM}
  863.   EPROCLIM           =  WSAEPROCLIM;
  864.   {$EXTERNALSYM EUSERS}
  865.   EUSERS             =  WSAEUSERS;
  866.   {$EXTERNALSYM EDQUOT}
  867.   EDQUOT             =  WSAEDQUOT;
  868.   {$EXTERNALSYM ESTALE}
  869.   ESTALE             =  WSAESTALE;
  870.   {$EXTERNALSYM EREMOTE}
  871.   EREMOTE            =  WSAEREMOTE;
  872.  
  873.  
  874. { Socket function prototypes }
  875.  
  876. {$EXTERNALSYM accept}
  877. function accept(s: TSocket; addr: PSockAddr; addrlen: PInteger): TSocket; stdcall;
  878. {$EXTERNALSYM bind}
  879. function bind(s: TSocket; var addr: TSockAddr; namelen: Integer): Integer; stdcall;
  880. {$EXTERNALSYM closesocket}
  881. function closesocket(s: TSocket): Integer; stdcall;
  882. {$EXTERNALSYM connect}
  883. function connect(s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
  884. {$EXTERNALSYM ioctlsocket}
  885. function ioctlsocket(s: TSocket; cmd: DWORD; var arg: u_long): Integer; stdcall;
  886. {$EXTERNALSYM getpeername}
  887. function getpeername(s: TSocket; var name: TSockAddr; var namelen: Integer): Integer; stdcall;
  888. {$EXTERNALSYM getsockname}
  889. function getsockname(s: TSocket; var name: TSockAddr; var namelen: Integer): Integer; stdcall;
  890. {$EXTERNALSYM getsockopt}
  891. function getsockopt(s: TSocket; level, optname: Integer; optval: PChar; var optlen: Integer): Integer; stdcall;
  892. {$EXTERNALSYM htonl}
  893. function htonl(hostlong: u_long): u_long; stdcall;
  894. {$EXTERNALSYM htons}
  895. function htons(hostshort: u_short): u_short; stdcall;
  896. {$EXTERNALSYM inet_addr}
  897. function inet_addr(cp: PChar): u_long; stdcall; {PInAddr;}  { TInAddr }
  898. {$EXTERNALSYM inet_ntoa}
  899. function inet_ntoa(inaddr: TInAddr): PChar; stdcall;
  900. {$EXTERNALSYM listen}
  901. function listen(s: TSocket; backlog: Integer): Integer; stdcall;
  902. {$EXTERNALSYM ntohl}
  903. function ntohl(netlong: u_long): u_long; stdcall;
  904. {$EXTERNALSYM ntohs}
  905. function ntohs(netshort: u_short): u_short; stdcall;
  906. {$EXTERNALSYM recv}
  907. function recv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  908. {$EXTERNALSYM recvfrom}
  909. function recvfrom(s: TSocket; var Buf; len, flags: Integer;
  910.   var from: TSockAddr; var fromlen: Integer): Integer; stdcall;
  911. {$EXTERNALSYM select}
  912. function select(nfds: Integer; readfds, writefds, exceptfds: PFDSet;
  913.   timeout: PTimeVal): Longint; stdcall;
  914. {$EXTERNALSYM send}
  915. function send(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  916. {$EXTERNALSYM sendto}
  917. function sendto(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr;
  918.   tolen: Integer): Integer; stdcall;
  919. {$EXTERNALSYM setsockopt}
  920. function setsockopt(s: TSocket; level, optname: Integer; optval: PChar;
  921.   optlen: Integer): Integer; stdcall;
  922. {$EXTERNALSYM shutdown}
  923. function shutdown(s: TSocket; how: Integer): Integer; stdcall;
  924. {$EXTERNALSYM socket}
  925. function socket(af, Struct, protocol: Integer): TSocket; stdcall;
  926. {$EXTERNALSYM gethostbyaddr}
  927. function gethostbyaddr(addr: Pointer; len, Struct: Integer): PHostEnt; stdcall;
  928. {$EXTERNALSYM gethostbyname}
  929. function gethostbyname(name: PChar): PHostEnt; stdcall;
  930. {$EXTERNALSYM gethostname}
  931. function gethostname(name: PChar; len: Integer): Integer; stdcall;
  932. {$EXTERNALSYM getservbyport}
  933. function getservbyport(port: Integer; proto: PChar): PServEnt; stdcall;
  934. {$EXTERNALSYM getservbyname}
  935. function getservbyname(name, proto: PChar): PServEnt; stdcall;
  936. {$EXTERNALSYM getprotobynumber}
  937. function getprotobynumber(proto: Integer): PProtoEnt; stdcall;
  938. {$EXTERNALSYM getprotobyname}
  939. function getprotobyname(name: PChar): PProtoEnt; stdcall;
  940. {$EXTERNALSYM WSAStartup}
  941. function WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer; stdcall;
  942. {$EXTERNALSYM WSACleanup}
  943. function WSACleanup: Integer; stdcall;
  944. {$EXTERNALSYM WSASetLastError}
  945. procedure WSASetLastError(iError: Integer); stdcall;
  946. {$EXTERNALSYM WSAGetLastError}
  947. function WSAGetLastError: Integer; stdcall;
  948. {$EXTERNALSYM WSAIsBlocking}
  949. function WSAIsBlocking: BOOL; stdcall;
  950. {$EXTERNALSYM WSAUnhookBlockingHook}
  951. function WSAUnhookBlockingHook: Integer; stdcall;
  952. {$EXTERNALSYM WSASetBlockingHook}
  953. function WSASetBlockingHook(lpBlockFunc: TFarProc): TFarProc; stdcall;
  954. {$EXTERNALSYM WSACancelBlockingCall}
  955. function WSACancelBlockingCall: Integer; stdcall;
  956. {$EXTERNALSYM WSAAsyncGetServByName}
  957. function WSAAsyncGetServByName(HWindow: HWND; wMsg: u_int;
  958.   name, proto, buf: PChar; buflen: Integer): THandle; stdcall;
  959. {$EXTERNALSYM WSAAsyncGetServByPort}
  960. function WSAAsyncGetServByPort( HWindow: HWND; wMsg, port: u_int;
  961.   proto, buf: PChar; buflen: Integer): THandle; stdcall;
  962. {$EXTERNALSYM WSAAsyncGetProtoByName}
  963. function WSAAsyncGetProtoByName(HWindow: HWND; wMsg: u_int;
  964.   name, buf: PChar; buflen: Integer): THandle; stdcall;
  965. {$EXTERNALSYM WSAAsyncGetProtoByNumber}
  966. function WSAAsyncGetProtoByNumber(HWindow: HWND; wMsg: u_int; number: Integer;
  967.   buf: PChar; buflen: Integer): THandle; stdcall;
  968. {$EXTERNALSYM WSAAsyncGetHostByName}
  969. function WSAAsyncGetHostByName(HWindow: HWND; wMsg: u_int;
  970.   name, buf: PChar; buflen: Integer): THandle; stdcall;
  971. {$EXTERNALSYM WSAAsyncGetHostByAddr}
  972. function WSAAsyncGetHostByAddr(HWindow: HWND; wMsg: u_int; addr: PChar;
  973.   len, Struct: Integer; buf: PChar; buflen: Integer): THandle; stdcall;
  974. {$EXTERNALSYM WSACancelAsyncRequest}
  975. function WSACancelAsyncRequest(hAsyncTaskHandle: THandle): Integer; stdcall;
  976. {$EXTERNALSYM WSAAsyncSelect}
  977. function WSAAsyncSelect(s: TSocket; HWindow: HWND; wMsg: u_int; lEvent: Longint): Integer; stdcall;
  978. {$EXTERNALSYM WSARecvEx}
  979. function WSARecvEx(s: TSocket; var buf; len: Integer; var flags: Integer): Integer; stdcall;
  980. {$EXTERNALSYM __WSAFDIsSet}
  981. function __WSAFDIsSet(s: TSocket; var FDSet: TFDSet): Bool; stdcall;
  982.  
  983. {$EXTERNALSYM TransmitFile}
  984. function TransmitFile(hSocket: TSocket; hFile: THandle; nNumberOfBytesToWrite: DWORD;
  985.   nNumberOfBytesPerSend: DWORD; lpOverlapped: POverlapped;
  986.   lpTransmitBuffers: PTransmitFileBuffers; dwReserved: DWORD): BOOL; stdcall;
  987.  
  988. {$EXTERNALSYM AcceptEx}
  989. function AcceptEx(sListenSocket, sAcceptSocket: TSocket;
  990.   lpOutputBuffer: Pointer; dwReceiveDataLength, dwLocalAddressLength,
  991.   dwRemoteAddressLength: DWORD; var lpdwBytesReceived: DWORD;
  992.   lpOverlapped: POverlapped): BOOL; stdcall;
  993.  
  994. {$EXTERNALSYM GetAcceptExSockaddrs}
  995. procedure GetAcceptExSockaddrs(lpOutputBuffer: Pointer;
  996.   dwReceiveDataLength, dwLocalAddressLength, dwRemoteAddressLength: DWORD;
  997.   var LocalSockaddr: TSockAddr; var LocalSockaddrLength: Integer;
  998.   var RemoteSockaddr: TSockAddr; var RemoteSockaddrLength: Integer); stdcall;
  999.  
  1000. {$EXTERNALSYM WSAMakeSyncReply}
  1001. function WSAMakeSyncReply(Buflen, Error: Word): Longint;
  1002. {$EXTERNALSYM WSAMakeSelectReply}
  1003. function WSAMakeSelectReply(Event, Error: Word): Longint;
  1004. {$EXTERNALSYM WSAGetAsyncBuflen}
  1005. function WSAGetAsyncBuflen(Param: Longint): Word;
  1006. {$EXTERNALSYM WSAGetAsyncError}
  1007. function WSAGetAsyncError(Param: Longint): Word;
  1008. {$EXTERNALSYM WSAGetSelectEvent}
  1009. function WSAGetSelectEvent(Param: Longint): Word;
  1010. {$EXTERNALSYM WSAGetSelectError}
  1011. function WSAGetSelectError(Param: Longint): Word;
  1012.  
  1013. {$EXTERNALSYM FD_CLR}
  1014. procedure FD_CLR(Socket: TSocket; var FDSet: TFDSet);
  1015. {$EXTERNALSYM FD_ISSET}
  1016. function FD_ISSET(Socket: TSocket; var FDSet: TFDSet): Boolean;
  1017. {$EXTERNALSYM FD_SET}
  1018. procedure FD_SET(Socket: TSocket; var FDSet: TFDSet); // renamed due to conflict with fd_set (above)
  1019. {$EXTERNALSYM FD_ZERO}
  1020. procedure FD_ZERO(var FDSet: TFDSet);
  1021.  
  1022. implementation
  1023.  
  1024. const
  1025.   winsocket = 'wsock32.dll';
  1026.  
  1027. function WSAMakeSyncReply;
  1028. begin
  1029.   WSAMakeSyncReply:= MakeLong(Buflen, Error);
  1030. end;
  1031.  
  1032. function WSAMakeSelectReply;
  1033. begin
  1034.   WSAMakeSelectReply:= MakeLong(Event, Error);
  1035. end;
  1036.  
  1037. function WSAGetAsyncBuflen;
  1038. begin
  1039.   WSAGetAsyncBuflen:= LOWORD(Param);
  1040. end;
  1041.  
  1042. function WSAGetAsyncError;
  1043. begin
  1044.   WSAGetAsyncError:= HIWORD(Param);
  1045. end;
  1046.  
  1047. function WSAGetSelectEvent;
  1048. begin
  1049.   WSAGetSelectEvent:= LOWORD(Param);
  1050. end;
  1051.  
  1052. function WSAGetSelectError;
  1053. begin
  1054.   WSAGetSelectError:= HIWORD(Param);
  1055. end;
  1056.  
  1057. procedure FD_CLR(Socket: TSocket; var FDSet: TFDSet);
  1058. var
  1059.   I: Integer;
  1060. begin
  1061.   I := 0;
  1062.   while I < FDSet.fd_count do
  1063.   begin
  1064.     if FDSet.fd_array[I] = Socket then
  1065.     begin
  1066.       while I < FDSet.fd_count - 1 do
  1067.       begin
  1068.         FDSet.fd_array[I] := FDSet.fd_array[I + 1];
  1069.         Inc(I);
  1070.       end;
  1071.       Dec(FDSet.fd_count);
  1072.       Break;
  1073.     end;
  1074.     Inc(I);
  1075.   end;
  1076. end;
  1077.  
  1078. function FD_ISSET(Socket: TSocket; var FDSet: TFDSet): Boolean;
  1079. begin
  1080.   Result := __WSAFDIsSet(Socket, FDSet);
  1081. end;
  1082.  
  1083. procedure FD_SET(Socket: TSocket; var FDSet: TFDSet);
  1084. begin
  1085.   if FDSet.fd_count < FD_SETSIZE then
  1086.   begin
  1087.     FDSet.fd_array[FDSet.fd_count] := Socket;
  1088.     Inc(FDSet.fd_count);
  1089.   end;
  1090. end;
  1091.  
  1092. procedure FD_ZERO(var FDSet: TFDSet);
  1093. begin
  1094.   FDSet.fd_count := 0;
  1095. end;
  1096.  
  1097. function accept;            external    winsocket name 'accept';
  1098. function bind;              external    winsocket name 'bind';
  1099. function closesocket;       external    winsocket name 'closesocket';
  1100. function connect;           external    winsocket name 'connect';
  1101. function getpeername;       external    winsocket name 'getpeername';
  1102. function getsockname;       external    winsocket name 'getsockname';
  1103. function getsockopt;        external    winsocket name 'getsockopt';
  1104. function htonl;             external    winsocket name 'htonl';
  1105. function htons;             external    winsocket name 'htons';
  1106. function inet_addr;         external    winsocket name 'inet_addr';
  1107. function inet_ntoa;         external    winsocket name 'inet_ntoa';
  1108. function ioctlsocket;       external    winsocket name 'ioctlsocket';
  1109. function listen;            external    winsocket name 'listen';
  1110. function ntohl;             external    winsocket name 'ntohl';
  1111. function ntohs;             external    winsocket name 'ntohs';
  1112. function recv;              external    winsocket name 'recv';
  1113. function recvfrom;          external    winsocket name 'recvfrom';
  1114. function select;            external    winsocket name 'select';
  1115. function send;              external    winsocket name 'send';
  1116. function sendto;            external    winsocket name 'sendto';
  1117. function setsockopt;        external    winsocket name 'setsockopt';
  1118. function shutdown;          external    winsocket name 'shutdown';
  1119. function socket;            external    winsocket name 'socket';
  1120.  
  1121. function gethostbyaddr;     external    winsocket name 'gethostbyaddr';
  1122. function gethostbyname;     external    winsocket name 'gethostbyname';
  1123. function getprotobyname;    external    winsocket name 'getprotobyname';
  1124. function getprotobynumber;  external    winsocket name 'getprotobynumber';
  1125. function getservbyname;     external    winsocket name 'getservbyname';
  1126. function getservbyport;     external    winsocket name 'getservbyport';
  1127. function gethostname;       external    winsocket name 'gethostname';
  1128.  
  1129. function WSAAsyncSelect;    external    winsocket name 'WSAAsyncSelect';
  1130. function WSARecvEx;         external    winsocket name 'WSARecvEx';
  1131. function WSAAsyncGetHostByAddr; external winsocket name 'WSAAsyncGetHostByAddr';
  1132. function WSAAsyncGetHostByName; external winsocket name 'WSAAsyncGetHostByName';
  1133. function WSAAsyncGetProtoByNumber; external winsocket name 'WSAAsyncGetProtoByNumber';
  1134. function WSAAsyncGetProtoByName; external winsocket name 'WSAAsyncGetProtoByName';
  1135. function WSAAsyncGetServByPort; external winsocket name 'WSAAsyncGetServByPort';
  1136. function WSAAsyncGetServByName; external winsocket name 'WSAAsyncGetServByName';
  1137. function WSACancelAsyncRequest; external winsocket name 'WSACancelAsyncRequest';
  1138. function WSASetBlockingHook; external    winsocket name 'WSASetBlockingHook';
  1139. function WSAUnhookBlockingHook; external winsocket name 'WSAUnhookBlockingHook';
  1140. function WSAGetLastError;    external    winsocket name 'WSAGetLastError';
  1141. procedure WSASetLastError;   external    winsocket name 'WSASetLastError';
  1142. function WSACancelBlockingCall; external winsocket name 'WSACancelBlockingCall';
  1143. function WSAIsBlocking;     external     winsocket name 'WSAIsBlocking';
  1144. function WSAStartup;        external     winsocket name 'WSAStartup';
  1145. function WSACleanup;        external     winsocket name 'WSACleanup';
  1146. function __WSAFDIsSet;      external     winsocket name '__WSAFDIsSet';
  1147.  
  1148. function TransmitFile;      external     winsocket name 'TransmitFile';
  1149. function AcceptEx;          external     winsocket name 'AcceptEx';
  1150. procedure GetAcceptExSockaddrs;  external    winsocket name 'GetAcceptExSockaddrs';
  1151.  
  1152. end.
  1153.