📄 jwawinsock2.pas
字号:
{******************************************************************************}
{ }
{ Winsock2 API interface Unit for Object Pascal }
{ }
{ Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft }
{ Corporation. All Rights Reserved. }
{ }
{ The original file is: winsock2.h, released June 2000. The original Pascal }
{ code is: WinSock2.pas, released December 2000. The initial developer of the }
{ Pascal code is Marcel van Brakel (brakelm@chello.nl). }
{ }
{ Portions created by Marcel van Brakel are Copyright (C) 1999-2001 }
{ Marcel van Brakel. All Rights Reserved. }
{ }
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
{ }
{ You may retrieve the latest version of this file at the Project JEDI home }
{ page, located at http://delphi-jedi.org or my personal homepage located at }
{ http://members.chello.nl/m.vanbrakel2 }
{ }
{ The contents of this file are used with permission, subject to the Mozilla }
{ Public License Version 1.1 (the "License"); you may not use this file except }
{ in compliance with the License. You may obtain a copy of the License at }
{ http://www.mozilla.org/MPL/MPL-1.1.html }
{ }
{ Software distributed under the License is distributed on an "AS IS" basis, }
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
{ the specific language governing rights and limitations under the License. }
{ }
{ Alternatively, the contents of this file may be used under the terms of the }
{ GNU Lesser General Public License (the "LGPL License"), in which case the }
{ provisions of the LGPL License are applicable instead of those above. }
{ If you wish to allow use of your version of this file only under the terms }
{ of the LGPL License and not to allow others to use your version of this file }
{ under the MPL, indicate your decision by deleting the provisions above and }
{ replace them with the notice and other provisions required by the LGPL }
{ License. If you do not delete the provisions above, a recipient may use }
{ your version of this file under either the MPL or the LGPL License. }
{ }
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
{ }
{******************************************************************************}
unit JwaWinsock2;
{$WEAKPACKAGEUNIT}
{$HPPEMIT ''}
{$HPPEMIT '#include "winsock2.h"'}
{$HPPEMIT ''}
{$I WINDEFINES.INC}
interface
uses
JwaQos, JwaWinType, JwaWinBase, JwaWinError, JwaWinNT;
type // TODO
ULONG_PTR = ULONG;
DWORD_PTR = DWORD;
PPChar = ^PChar;
{$NODEFINE PPChar}
HANDLE = THandle;
{$NODEFINE HANDLE}
LPHANDLE = ^THandle;
{$NODEFINE LPHANDLE}
LPBYTE = ^BYTE;
{$NODEFINE LPBYTE}
LPVOID = Pointer;
{$NODEFINE LPVOID}
USHORT = Word;
{$NODEFINE USHORT}
UCHAR = Byte;
{$NODEFINE UCHAR}
ULONG = Cardinal;
{$NODEFINE ULONG}
//#include <pshpack4.h>
{$ALIGN ON}
// Winsock2.h -- definitions to be used with the WinSock 2 DLL and
// WinSock 2 applications.
//
// This header file corresponds to version 2.2.x of the WinSock API
// specification.
//
// This file includes parts which are Copyright (c) 1982-1986 Regents
// of the University of California. All rights reserved. The
// Berkeley Software License Agreement specifies the terms and
// conditions for redistribution.
//
(*
* Default: include function prototypes, don't include function typedefs.
*)
{$IFNDEF INCL_WINSOCK_API_PROTOTYPES}
const
INCL_WINSOCK_API_PROTOTYPES = 1;
{$EXTERNALSYM INCL_WINSOCK_API_PROTOTYPES}
{$ENDIF}
{$IFNDEF INCL_WINSOCK_API_TYPEDEFS}
const
INCL_WINSOCK_API_TYPEDEFS = 0;
{$EXTERNALSYM INCL_WINSOCK_API_TYPEDEFS}
{$ENDIF}
const
WINSOCK_VERSION = $0202;
{$EXTERNALSYM WINSOCK_VERSION}
//
// Basic system type definitions, taken from the BSD file sys/types.h.
//
type
u_char = Byte;
{$EXTERNALSYM u_char}
u_short = Word;
{$EXTERNALSYM u_short}
u_int = Cardinal;
{$EXTERNALSYM u_int}
u_long = Cardinal;
{$EXTERNALSYM u_long}
u_int64 = Int64; // unsigned __int64 !! TODO For Delphi 7 ??
{$EXTERNALSYM u_int64}
//
// The new type to be used in all
// instances which refer to sockets.
//
type
TSocket = Cardinal;
//
// Select uses arrays of SOCKETs. These macros manipulate such
// arrays. FD_SETSIZE may be defined by the user before including
// this file, but the default here should be >= 64.
//
// CAVEAT IMPLEMENTOR and USER: THESE MACROS AND TYPES MUST BE
// INCLUDED IN WINSOCK2.H EXACTLY AS SHOWN HERE.
//
const
FD_SETSIZE = 64;
{$EXTERNALSYM FD_SETSIZE}
type
fd_set = record
fd_count: u_int; // how many are SET?
fd_array: array [0..FD_SETSIZE - 1] of TSocket; // an array of SOCKETs
end;
{$EXTERNALSYM fd_set}
TFdSet = fd_set;
PFdSet = ^fd_set;
function __WSAFDIsSet(s: TSocket; var FDSet: TFDSet): Integer; stdcall;
{$EXTERNALSYM __WSAFDIsSet}
procedure FD_CLR(fd: TSocket; var fdset: TFdSet);
{$EXTERNALSYM FD_CLR}
procedure _FD_SET(fd: TSocket; var fdset: TFDSet);
//{$EXTERNALSYM FD_SET}
procedure FD_ZERO(var fdset: TFdSet);
{$EXTERNALSYM FD_ZERO}
function FD_ISSET(fd: TSocket; var fdset: TFdSet): Boolean;
{$EXTERNALSYM FD_ISSET}
//
// Structure used in select() call, taken from the BSD file sys/time.h.
//
type
timeval = record
tv_sec: Longint; // seconds
tv_usec: Longint; // and microseconds
end;
{$EXTERNALSYM timeval}
TTimeVal = timeval;
PTimeVal = ^timeval;
//
// Operations on timevals.
//
// NB: timercmp does not work for >= or <=.
//
function timerisset(const tvp: TTimeVal): Boolean;
{$EXTERNALSYM timerisset}
//function timercmp(const tvp, uvp: TTimeVal; cmp): Boolean;
//{$EXTERNALSYM timercmp}
procedure timerclear(var tvp: TTimeVal);
{$EXTERNALSYM timerclear}
//
// Commands for ioctlsocket(), taken from the BSD file fcntl.h.
//
//
// Ioctl's have the command encoded in the lower word,
// and the size of any in or out parameters in the upper
// word. The high 2 bits of the upper word are used
// to encode the in/out status of the parameter; for now
// we restrict parameters to at most 128 bytes.
//
const
IOCPARM_MASK = $7f; // parameters must be < 128 bytes
{$EXTERNALSYM IOCPARM_MASK}
IOC_VOID = $20000000; // no parameters
{$EXTERNALSYM IOC_VOID}
IOC_OUT = $40000000; // copy out parameters
{$EXTERNALSYM IOC_OUT}
IOC_IN = DWORD($80000000); // copy in parameters
{$EXTERNALSYM IOC_IN}
IOC_INOUT = DWORD(IOC_IN or IOC_OUT);
{$EXTERNALSYM IOC_INOUT}
// 0x20000000 distinguishes new & old ioctl's
function _IO(x, y: DWORD): DWORD;
{$EXTERNALSYM _IO}
function _IOR(x, y, t: DWORD): DWORD;
{$EXTERNALSYM _IOR}
function _IOW(x, y, t: DWORD): DWORD;
{$EXTERNALSYM _IOW}
const
FIONREAD = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 127; // get # bytes to read
{$EXTERNALSYM FIONREAD}
FIONBIO = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 126; // set/clear non-blocking i/o
{$EXTERNALSYM FIONBIO}
FIOASYNC = IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('f') shl 8) or 125; // set/clear async i/o
{$EXTERNALSYM FIOASYNC}
// Socket I/O Controls
SIOCSHIWAT = DWORD(IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 0); // set high watermark
{$EXTERNALSYM SIOCSHIWAT}
SIOCGHIWAT = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 1; // get high watermark
{$EXTERNALSYM SIOCGHIWAT}
SIOCSLOWAT = DWORD(IOC_IN or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 2); // set low watermark
{$EXTERNALSYM SIOCSLOWAT}
SIOCGLOWAT = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 3; // get low watermark
{$EXTERNALSYM SIOCGLOWAT}
SIOCATMARK = IOC_OUT or ((SizeOf(u_long) and IOCPARM_MASK) shl 16) or (Ord('s') shl 8) or 7; // at oob mark?
{$EXTERNALSYM SIOCATMARK}
//
// 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).
//
type
hostent = record
h_name: PChar; // official name of host
h_aliases: PPChar; // alias list
h_addrtype: Smallint; // host address type
h_length: Smallint; // length of address
case Integer of
0: (h_addr_list: PPChar); // list of addresses
1: (h_addr: PPChar); // address, for backward compat
end;
{$EXTERNALSYM hostent}
THostEnt = hostent;
PHostEnt = ^hostent;
//
// It is assumed here that a network number
// fits in 32 bits.
//
type
netent = record
n_name: PChar; // official name of net
n_aliases: PPChar; // alias list
n_addrtype: Smallint; // net address type
n_net: u_long; // network #
end;
{$EXTERNALSYM netent}
TNetEnt = netent;
PNetEnt = ^netent;
servent = record
s_name: PChar; // official service name
s_aliases: PPChar; // alias list
s_port: Smallint; // port #
s_proto: PChar; // protocol to use
end;
{$EXTERNALSYM servent}
TServEnt = servent;
PServEnt = ^servent;
protoent = record
p_name: PChar; // official protocol name
p_aliases: PPChar; // alias list
p_proto: Smallint; // protocol #
end;
{$EXTERNALSYM protoent}
TProtoEnt = protoent;
PProtoEnt = ^protoent;
//
// Constants and structures defined by the internet system,
// Per RFC 790, September 1981, taken from the BSD file netinet/in.h.
//
//
// Protocols
//
const
IPPROTO_IP = 0; // dummy for IP
{$EXTERNALSYM IPPROTO_IP}
IPPROTO_HOPOPTS = 0; // IPv6 hop-by-hop options
{$EXTERNALSYM IPPROTO_HOPOPTS}
IPPROTO_ICMP = 1; // control message protocol
{$EXTERNALSYM IPPROTO_ICMP}
IPPROTO_IGMP = 2; // internet group management protocol
{$EXTERNALSYM IPPROTO_IGMP}
IPPROTO_GGP = 3; // gateway^2 (deprecated)
{$EXTERNALSYM IPPROTO_GGP}
IPPROTO_IPV4 = 4; // IPv4
{$EXTERNALSYM IPPROTO_IPV4}
IPPROTO_TCP = 6; // tcp
{$EXTERNALSYM IPPROTO_TCP}
IPPROTO_PUP = 12; // pup
{$EXTERNALSYM IPPROTO_PUP}
IPPROTO_UDP = 17; // user datagram protocol
{$EXTERNALSYM IPPROTO_UDP}
IPPROTO_IDP = 22; // xns idp
{$EXTERNALSYM IPPROTO_IDP}
IPPROTO_IPV6 = 41; // IPv6
{$EXTERNALSYM IPPROTO_IPV6}
IPPROTO_ROUTING = 43; // IPv6 routing header
{$EXTERNALSYM IPPROTO_ROUTING}
IPPROTO_FRAGMENT = 44; // IPv6 fragmentation header
{$EXTERNALSYM IPPROTO_FRAGMENT}
IPPROTO_ESP = 50; // IPsec ESP header
{$EXTERNALSYM IPPROTO_ESP}
IPPROTO_AH = 51; // IPsec AH
{$EXTERNALSYM IPPROTO_AH}
IPPROTO_ICMPV6 = 58; // ICMPv6
{$EXTERNALSYM IPPROTO_ICMPV6}
IPPROTO_NONE = 59; // IPv6 no next header
{$EXTERNALSYM IPPROTO_NONE}
IPPROTO_DSTOPTS = 60; // IPv6 destination options
{$EXTERNALSYM IPPROTO_DSTOPTS}
IPPROTO_ND = 77; // UNOFFICIAL net disk proto
{$EXTERNALSYM IPPROTO_ND}
IPPROTO_ICLFXBM = 78;
{$EXTERNALSYM IPPROTO_ICLFXBM}
IPPROTO_RAW = 255; // raw IP packet
{$EXTERNALSYM IPPROTO_RAW}
IPPROTO_MAX = 256;
{$EXTERNALSYM IPPROTO_MAX}
//
// Port/socket numbers: network standard functions
//
IPPORT_ECHO = 7;
{$EXTERNALSYM IPPORT_ECHO}
IPPORT_DISCARD = 9;
{$EXTERNALSYM IPPORT_DISCARD}
IPPORT_SYSTAT = 11;
{$EXTERNALSYM IPPORT_SYSTAT}
IPPORT_DAYTIME = 13;
{$EXTERNALSYM IPPORT_DAYTIME}
IPPORT_NETSTAT = 15;
{$EXTERNALSYM IPPORT_NETSTAT}
IPPORT_FTP = 21;
{$EXTERNALSYM IPPORT_FTP}
IPPORT_TELNET = 23;
{$EXTERNALSYM IPPORT_TELNET}
IPPORT_SMTP = 25;
{$EXTERNALSYM IPPORT_SMTP}
IPPORT_TIMESERVER = 37;
{$EXTERNALSYM IPPORT_TIMESERVER}
IPPORT_NAMESERVER = 42;
{$EXTERNALSYM IPPORT_NAMESERVER}
IPPORT_WHOIS = 43;
{$EXTERNALSYM IPPORT_WHOIS}
IPPORT_MTP = 57;
{$EXTERNALSYM IPPORT_MTP}
//
// Port/socket numbers: host specific functions
//
IPPORT_TFTP = 69;
{$EXTERNALSYM IPPORT_TFTP}
IPPORT_RJE = 77;
{$EXTERNALSYM IPPORT_RJE}
IPPORT_FINGER = 79;
{$EXTERNALSYM IPPORT_FINGER}
IPPORT_TTYLINK = 87;
{$EXTERNALSYM IPPORT_TTYLINK}
IPPORT_SUPDUP = 95;
{$EXTERNALSYM IPPORT_SUPDUP}
//
// UNIX TCP sockets
//
IPPORT_EXECSERVER = 512;
{$EXTERNALSYM IPPORT_EXECSERVER}
IPPORT_LOGINSERVER = 513;
{$EXTERNALSYM IPPORT_LOGINSERVER}
IPPORT_CMDSERVER = 514;
{$EXTERNALSYM IPPORT_CMDSERVER}
IPPORT_EFSSERVER = 520;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -