mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-15 11:49:27 +02:00
+ initial revision, should be completly compatible with the delphi
winsock unit
This commit is contained in:
parent
14fadbcaca
commit
e8172b7192
930
rtl/win32/winsock.pp
Normal file
930
rtl/win32/winsock.pp
Normal file
@ -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
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user