832 lines
23 KiB
Plaintext
832 lines
23 KiB
Plaintext
unit SockFunc;
|
|
(*
|
|
**
|
|
** SOCKFUNC routines
|
|
**
|
|
** Copyright (c) 1998 by Thomas W. Mueller
|
|
** Linux additions (c)1999 by Maarten Bekers
|
|
**
|
|
** Created : 24-Oct-1998
|
|
** Last update : 24-Oct-1998
|
|
**
|
|
**
|
|
*)
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
INTERFACE
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-
|
|
** Copyright (c) 1982, 1985, 1986 Regents of the University of California.
|
|
** All rights reserved.
|
|
**
|
|
** Redistribution and use in source and binary forms are permitted
|
|
** provided that this notice is preserved and that due credit is given
|
|
** to the University of California at Berkeley. The name of the University
|
|
** may not be used to endorse or promote products derived from this
|
|
** software without specific prior written permission. This software
|
|
** is provided ``as is'' without express or implied warranty.
|
|
s**
|
|
** @(#)socket.h 7.2 (Berkeley) 12/30/87
|
|
-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
uses
|
|
{$IFDEF OS2}
|
|
OS2Def,
|
|
IBMSO32,
|
|
IBMTCP32,
|
|
{$ENDIF}
|
|
|
|
{$IFDEF WIN32}
|
|
windows,
|
|
W32Sock,
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
linux,
|
|
Linsock,
|
|
{$ENDIF}
|
|
|
|
Sysutils,
|
|
SockDef;
|
|
|
|
Const SockInitted : Boolean = false;
|
|
|
|
function SockErrorNo: Longint;
|
|
function SockGetErrStr(_ErrNo: integer): ShortString;
|
|
procedure SockRaiseError(const _prefix: String; _ErrNo: integer);
|
|
procedure SockRaiseLastError(const _prefix: String);
|
|
|
|
function SockAccept(_SockDesc: tSockDesc; _SockAddr: pSockAddr;
|
|
var _SockAddrLen: Longint): tSockDesc;
|
|
function SockBind(_SockDesc: tSockDesc; var _SockAddr: tSockAddr): Longint;
|
|
function SockCancel(_SockDesc: tSockDesc): Longint;
|
|
function SockConnect(_SockDesc: tSockDesc; var _SockAddr: tSockAddr): Longint;
|
|
function SockGetHostByName(Hostname: ShortString): phostent;
|
|
function SockShutdown(_SockDesc: tSockDesc; _how: ULong): Longint;
|
|
function SockGetSockAddr(_SockDesc: tSockDesc; var _SockAddr: tSockAddr): Longint;
|
|
function SockGetSockOpt(_SockDesc: tSockDesc; _Level, _OptName: Integer;
|
|
_OptVal: PChar; var _OptLen: Integer): Longint;
|
|
function SockSetSockOpt(_SockDesc: tSockDesc; _Level: uLong; _OptName: Ulong;
|
|
_OptVal: pChar; _OptLen: uLong ): Longint;
|
|
function SockSetBlockingIO(_SockDesc: tSockDesc; _BlockingIO: boolean): Longint;
|
|
function SockIoCtlSocket(_SockDesc: tSockDesc; Func: Longint): Longint;
|
|
function SockListen(_SockDesc: tSockDesc; _SockQueue: ULong): Longint;
|
|
function SockRecv(_SockDesc: tSockDesc; _SockBuffer: pointer;
|
|
_SockBufLen: ULong; _SockFlags: ULong): Longint;
|
|
function SockSend(_SockDesc: tSockDesc; _SockBuffer: pointer;
|
|
_SockBufLen: ULong; _SockFlags: ULong ): Longint;
|
|
function SockSocket(_SockFamily: word; _SockType: word;
|
|
_SockProtocol: word ): tSockDesc;
|
|
function SockClose(_SockDesc: tSockDesc): Longint;
|
|
function SockInit: Longint;
|
|
function SockClientAlive(_SockDesc: tSockDesc): Boolean;
|
|
|
|
function SockGetHostAddrByName(_HostName: ShortString): ULONG;
|
|
function SockGetHostNameByAddr(_HostAddr: pIn_Addr): ShortString;
|
|
function SockGetHostname: ShortString;
|
|
|
|
function SockGetServByName(_Name, _Proto: ShortString): pServEnt;
|
|
function SockGetServPortByName(_Name, _Proto: ShortString): Longint;
|
|
|
|
function SockHtonl(_Input: LongInt): longint;
|
|
function SockHtons(_Input: SmallWord): SmallWord;
|
|
|
|
function SockNtohl(_Input: LongInt): longint;
|
|
function SockNtohs(_Input: SmallWord): longint;
|
|
function SockDataAvail(_SockDesc: tSockDesc): Boolean;
|
|
function SockSelect(_SockDesc: tSockDesc): Longint;
|
|
function SockInetAddr(_s: ShortString):tIn_Addr;
|
|
|
|
{$IFNDEF LINUX}
|
|
{$IFNDEF FPC}
|
|
{$R SOCKFUNC.RES}
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
IMPLEMENTATION
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
Const
|
|
Version = '1.00';
|
|
UseString: ShortString = '@(#)socket interface unit for IBM TCP/IP and WinSock'#0;
|
|
CopyRight1: ShortString = '@(#)socket Version '+Version+' - 26.08.1998'#0;
|
|
CopyRight2: ShortString = '@(#}(C) Thomas Mueller 1998'#0;
|
|
CopyRight3: ShortString = '@(#)(C) Chr.Hohmann BfS ST2.2 1996'#0;
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
|
|
function SockErrorNo: Longint;
|
|
begin
|
|
{$IFDEF OS2}
|
|
Result := IBM_sock_errno;
|
|
{$ENDIF}
|
|
|
|
{$IFDEF WIN32}
|
|
Result := WsaGetLastError;
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
Result := SocketError;
|
|
{$ENDIF}
|
|
end; { func. SockErrorNo }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockGetErrStr(_ErrNo: integer): ShortString;
|
|
begin
|
|
Result:=LoadStr(_ErrNo);
|
|
end; { func. SockGetErrStr }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
procedure SockRaiseError(const _prefix: String; _ErrNo: integer);
|
|
begin
|
|
raise eSocketErr.CreateFmt('%s: %s (%d)',
|
|
[_prefix, SockGetErrStr(_ErrNo), _ErrNo]);
|
|
end; { proc. SockRaiseError }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
procedure SockRaiseLastError(const _prefix: String);
|
|
begin
|
|
SockRaiseError(_Prefix, SockErrorNo);
|
|
end; { proc. SockRaiseLastError }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
|
|
function SockGetServByName(_Name, _Proto: ShortString): pServEnt;
|
|
begin
|
|
_Name := _Name + #00;
|
|
_Proto := _Proto + #00;
|
|
|
|
{$IFDEF WIN32}
|
|
Result := getservbyname(@_Name[01], @_Proto[01]);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
Result := ibm_getservbyname(@_Name[01], @_Proto[01]);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
Result := getservbyname(@_Name[1], @_Proto[01]);
|
|
{$ENDIF}
|
|
end; { func. SockGetServByName }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockGetServPortByName(_Name, _Proto: ShortString): longint;
|
|
var ServEnt: pServEnt;
|
|
begin
|
|
ServEnt := SockGetServByName(_Name, _Proto);
|
|
|
|
if Assigned(ServEnt) then
|
|
Result := ServEnt^.s_Port
|
|
else Result := -01;
|
|
end; { func. SockGetServPortByName }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockHtonl( _Input: longint): longint;
|
|
type SwapLong = packed record
|
|
case integer of
|
|
0: (SLong: longint);
|
|
1: (SArray: packed array[1..4] of byte);
|
|
end;
|
|
var Inp,
|
|
Tmp: SwapLong;
|
|
begin
|
|
Inp.SLong := _Input;
|
|
Tmp.SArray[1] := Inp.SArray[4];
|
|
Tmp.SArray[2] := Inp.SArray[3];
|
|
Tmp.SArray[3] := Inp.SArray[2];
|
|
Tmp.SArray[4] := Inp.SArray[1];
|
|
result := Tmp.SLong;
|
|
end;
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockHtons( _Input: SmallWord): SmallWord;
|
|
type SwapWord = packed record
|
|
case integer of
|
|
0: (SWord: SmallWord);
|
|
1: (SArray: packed array[1..2] of byte);
|
|
end;
|
|
var Inp,Tmp: SwapWord;
|
|
begin
|
|
Inp.SWord := _Input;
|
|
Tmp.SArray[1] := Inp.SArray[2];
|
|
Tmp.SArray[2] := Inp.SArray[1];
|
|
Result := Tmp.SWord;
|
|
end; { func. SockhToNl }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockNtohl( _Input: longint): longint;
|
|
begin
|
|
{$IFNDEF LINUX}
|
|
Result:=ntohl(_Input);
|
|
{$ELSE}
|
|
{!!!!!!!!!!!!!!!!!!!!!!!}
|
|
Result := _Input;
|
|
{$ENDIF}
|
|
end; { func. sockNToHl }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockNtohs( _Input: SmallWord): longint;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
Result := ntohs( _input);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
{!!!!! Result := ntohs( _input);}
|
|
Result := Lo(_Input) * 256 + Hi(_Input);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
Result := ntohs(_input);
|
|
{$ENDIF}
|
|
end; { func. SockNToHs }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockAccept(_SockDesc: tSockDesc;
|
|
_SockAddr: pSockAddr;
|
|
var _SockAddrLen: Longint): longint;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
Result := Accept(_SockDesc, _SockAddr, @_SockAddrLen);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
Result := IBM_Accept(_SockDesc, _SockAddr, @_SockAddrLen);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
Result := Accept(_SockDesc, _SockAddr^, _SockAddrLen);
|
|
{$ENDIF}
|
|
end; { func. SockAccept }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockBind(_SockDesc: tSockDesc;
|
|
var _SockAddr: tSockAddr ): Longint;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
SockBind := Bind(_SockDesc, @_SockAddr, SockAddr_Len);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
SockBind := IBM_Bind(_SockDesc, @_SockAddr, SockAddr_Len);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
SockBind := Longint(Bind(_SockDesc, _SockAddr, SockAddr_Len));
|
|
{$ENDIF}
|
|
end; { func. SockBind }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockConnect(_SockDesc: tSockDesc;
|
|
var _SockAddr: tSockAddr): Longint;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
SockConnect := connect(_SockDesc, @_SockAddr, SockAddr_Len);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
SockConnect := ibm_connect(_SockDesc, @_SockAddr, SockAddr_Len);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
SockConnect := connect(_SockDesc, _SockAddr, sockAddr_Len);
|
|
{$ENDIF}
|
|
end; { func. SockConnect }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockCancel(_SockDesc: tSockDesc): Longint;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
Result := SockCancel(_SockDesc);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
Result := IBM_So_Cancel(_SockDesc);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
Result := longint(true);
|
|
if _SockDesc=0 then ;
|
|
|
|
{$WARNING SockCancel function not implemented }
|
|
{!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
|
|
{$ENDIF}
|
|
end; { func. SockCancel }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockShutdown(_SockDesc: tSockDesc;
|
|
_how: ULong): Longint;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
SockShutdown := ShutDown(_SockDesc, _How);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
SockShutDown := IBM_ShutDown(_SockDesc, _How);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
SockShutDown := ShutDown(_SockDesc, _How);
|
|
{$ENDIF}
|
|
end; { func. SockShutDown }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockGetSockAddr(_SockDesc: tSockDesc; var _SockAddr: tSockAddr): Longint;
|
|
var sLength: Integer;
|
|
begin
|
|
FillChar(_SockAddr, SizeOf(_SockAddr), #00);
|
|
sLength := SizeOf(_SockAddr);
|
|
|
|
{$IFDEF WIN32}
|
|
Result := GetSockName(_SockDesc, @_SockAddr, sLength);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
Result := IBM_GetSockName(_SockDesc, @_SockAddr, @sLength);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
Result := GetSocketName(_SockDesc, _SockAddr, sLength);
|
|
{$ENDIF}
|
|
end; { func. sockGetSockAddr }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockSetBlockingIO(_SockDesc: tSockDesc;
|
|
_BlockingIO: boolean): Longint;
|
|
var Arg: ULONG;
|
|
begin
|
|
{$IFDEF OS2}
|
|
if _BlockingIO then Arg := 00
|
|
else Arg := 01;
|
|
|
|
Result := IBM_IOCtl(_SockDesc, FIONBIO, @Arg, SizeOf(Arg));
|
|
{$ENDIF}
|
|
|
|
{$IFDEF WIN32}
|
|
if _BlockingIO then Arg := 00
|
|
else Arg := 01;
|
|
|
|
Result := IOCtlSocket(_SockDesc, FIONBIO, Arg);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
if _BlockingIO then Arg := 00
|
|
else Arg := 01;
|
|
|
|
Result := Longint(ioctl(_SockDesc, Linux.FIONBIO, @Arg));
|
|
{$ENDIF}
|
|
end; { func. SockSetBlockingIO }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockIoCtlSocket(_SockDesc: tSockDesc; Func: Longint): Longint;
|
|
var Arg: ULONG;
|
|
begin
|
|
Arg := 0;
|
|
|
|
{$IFDEF OS2}
|
|
Result := IBM_IOCtl(_SockDesc, FUNC, @Arg, SizeOf(Arg));
|
|
{$ENDIF}
|
|
|
|
{$IFDEF WIN32}
|
|
Result := IOCtlSocket(_SockDesc, FUNC, Arg);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
Result := Longint(IoCtl(_SockDesc, Func, @Arg));
|
|
{$ENDIF}
|
|
end; { func. SockIoCtlSocket }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockGetSockOpt(_SockDesc: tSockDesc; _Level, _OptName: Integer;
|
|
_OptVal: PChar; var _OptLen: Integer): Longint;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
Result := GetSockOpt(_SockDesc, _Level, _OptName, _OptVal, _OptLen);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
Result := IBM_GetSockOpt(_SockDesc, _Level, _OptName, _OptVal, _OptLen);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
Result := SetSocketOptions(_SockDesc, _Level, _OptName, _OptVal, _OptLen);
|
|
{$ENDIF}
|
|
end; { func. SockGetSockOpt }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockSetSockOpt(_SockDesc: tSockDesc; _Level: uLong; _OptName: Ulong;
|
|
_OptVal: pChar; _OptLen: uLong ): Longint;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
Result := SetSockOpt(_SockDesc, _Level, _OptName, _OptVal, _OptLen);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
Result := IBM_SetSockOpt(_SockDesc, _Level, _OptName, _OptVal, _OptLen);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
Result := SetSocketOptions(_SockDesc, _Level, _OptName, _OptVal, _OptLen);
|
|
{$ENDIF}
|
|
end; { func. SockSetSockOpt }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockDataAvail(_SockDesc: tSockDesc): Boolean;
|
|
{$IFDEF LINUX}
|
|
var ReadFDS : FDSet;
|
|
Temp : Longint;
|
|
{$ENDIF}
|
|
begin
|
|
{$IFNDEF LINUX}
|
|
Result := (SockSelect(_SockDesc) > 00);
|
|
{$ELSE}
|
|
fd_Zero(ReadFDS);
|
|
fd_Set(_SockDesc, ReadFDS);
|
|
|
|
|
|
Temp := Select(_SockDesc + 01, @ReadFDS, nil, nil, 0);
|
|
if (Temp > 0) then
|
|
begin
|
|
SockDataAvail := FD_ISSET(_SockDesc, ReadFDS);
|
|
end { if }
|
|
else SockDataAvail := false;
|
|
{$ENDIF}
|
|
(*
|
|
{$IFDEF OS2}
|
|
Arg := 00;
|
|
Result := IBM_IOCTL(_SockDesc, FIONREAD, @Arg, SizeOf(Arg));
|
|
|
|
if Arg > 00 then Result := Arg
|
|
else Result := $FFFFFFFF;
|
|
{$ENDIF}
|
|
|
|
{$IFDEF WIN32}
|
|
Result := IOCtlSocket(_SockDesc, FIONREAD, Arg);
|
|
if Arg > 00 then Result := Arg
|
|
else Result := $FFFFFFFF;
|
|
{$ENDIF}
|
|
*)
|
|
end; { func. SockDataAvail }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockListen(_SockDesc: tSockDesc;
|
|
_SockQueue: ULong): Longint;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
SockListen := listen(_SockDesc, _SockQueue);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
SockListen := ibm_listen(_SockDesc, _SockQueue);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
SockListen := Longint(Listen(_SockDesc, _SockQueue));
|
|
{$ENDIF}
|
|
end; { func. SockListen }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockSelect(_SockDesc: tSockDesc ): Longint;
|
|
{$IFDEF OS2}
|
|
var SockCopy: ULONG;
|
|
{$ENDIF}
|
|
|
|
{$IFDEF WIN32}
|
|
var SockArr : TFDSet;
|
|
Timeout : TTimeVal;
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
var ReadFDS : FDSet;
|
|
{$ENDIF}
|
|
begin
|
|
{$IFDEF OS2}
|
|
SockCopy := _SockDesc;
|
|
Result := IBM_Select(@SockCopy, 1, 0, 0, 0);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF WIN32}
|
|
SockArr.fd_Count := 01;
|
|
SockArr.fd_Array[00] := _SockDesc;
|
|
Timeout.tv_sec := 00;
|
|
Timeout.tv_usec := 00;
|
|
|
|
Result := Select(00, @SockArr, NIL, NIL, @Timeout);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
fd_Zero(ReadFDS);
|
|
fd_Set(_SockDesc, ReadFDS);
|
|
|
|
SockSelect := Select(_SockDesc + 01, @ReadFDS, nil, nil, 0);
|
|
{$ENDIF}
|
|
end; { func. SockSelect }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+ -*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockRecv(_SockDesc: tSockDesc;
|
|
_SockBuffer: pointer;
|
|
_SockBufLen: ULong;
|
|
_SockFlags: ULong): Longint;
|
|
var Counter: Longint;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
SockRecv := recv(_SockDesc,
|
|
_SockBuffer,
|
|
_SockBufLen,
|
|
_SockFlags);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
SockRecv := ibm_recv(_SockDesc,
|
|
_SockBuffer,
|
|
_SockBufLen,
|
|
_SockFlags);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
SockRecv := Recv(_SockDesc,
|
|
_SockBuffer^,
|
|
_SockBufLen,
|
|
_SockFlags);
|
|
{$ENDIF}
|
|
end; { func. SockRecv }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockSend(_SockDesc: tSockDesc;
|
|
_SockBuffer: pointer;
|
|
_SockBufLen: ULong;
|
|
_SockFlags: ULong): Longint;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
SockSend := Send(_SockDesc,
|
|
_SockBuffer,
|
|
_SockBufLen,
|
|
_SockFlags);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
SockSend := IBM_Send(_SockDesc,
|
|
_SockBuffer,
|
|
_SockBufLen,
|
|
_SockFlags);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
SockSend := Send(_SockDesc,
|
|
_SockBuffer^,
|
|
_SockBufLen,
|
|
_SockFlags);
|
|
{$ENDIF}
|
|
end; { func. SockSend }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockSocket(_SockFamily: word;
|
|
_SockType: word;
|
|
_SockProtocol: word): tSockDesc;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
SockSocket := Socket(_SockFamily, _SockType, _SockProtocol);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
SockSocket := ibm_Socket(_SockFamily, _SockType, _SockProtocol);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
SockSocket := Socket(_SockFamily, _SockType, _SockProtocol);
|
|
{$ENDIF}
|
|
end; { func. SockSocket }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockClose(_SockDesc: tSockDesc): Longint;
|
|
begin
|
|
{$IFDEF OS2}
|
|
Result := IBM_soclose(_SockDesc);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF WIN32}
|
|
Result := Closesocket(_SockDesc);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
Result := Longint(fdClose(_SockDesc));
|
|
{$ENDIF}
|
|
end; { func. SockClose }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockInit: Longint;
|
|
{$IFDEF WIN32}
|
|
var Data: TWSAData;
|
|
{$ENDIF}
|
|
begin
|
|
if SockInitted then EXIT;
|
|
SockInitted := true;
|
|
|
|
{$IFDEF OS2}
|
|
SockInit := IBM_Sock_Init;
|
|
{$ENDIF}
|
|
|
|
{$IFDEF WIN32}
|
|
SockInit := WsaStartup($0101, Data);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
SockInit := 0;
|
|
{$ENDIF}
|
|
end; { func. SockInit }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockGetHostByName(Hostname: ShortString): phostent;
|
|
begin
|
|
HostName := HostName + #00;
|
|
{$IFDEF WIN32}
|
|
Result := GetHostByName(@HostName[01]);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
Result := IBM_GetHostByName(@HostName[01]);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
Result := GetHostByName(@HostName[1]);
|
|
{$ENDIF}
|
|
end; { func. SockGetHostByName }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockGetHostAddrByName(_HostName: ShortString): ULong;
|
|
var ReturnCode: pHostEnt;
|
|
InAddr : tIn_Addr;
|
|
begin
|
|
ReturnCode := SockGetHostbyName(_HostName);
|
|
if Assigned(ReturnCode) then
|
|
begin
|
|
InAddr := ReturnCode^.H_Addr_List^^;
|
|
Result := InAddr.IpAddr;
|
|
end
|
|
else Result:=$FFFFFFFF;
|
|
end; { func. SockGetHostAddrByName }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockGetHostByAddr(HostAddr: pIn_Addr;
|
|
HostAddrLen: ULong;
|
|
HostAddrType: ULong): pointer;
|
|
begin
|
|
{$IFDEF WIN32}
|
|
SockGetHostByAddr := GetHostbyAddr(HostAddr,
|
|
HostAddrLen,
|
|
HostAddrType);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
SockGetHostByAddr := IBM_GetHostbyAddr(HostAddr,
|
|
HostAddrLen,
|
|
HostAddrType);
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
Result := GetHostByAddr(HostAddr, HostAddrLen, HostAddrtype);
|
|
{$ENDIF}
|
|
end; { func. SockGetHostbyAddr }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockGetHostNameByAddr(_HostAddr: pIn_Addr): ShortString;
|
|
var Counter : Integer;
|
|
ReturnCode: pHostEnt;
|
|
HName : ShortString;
|
|
begin
|
|
ReturnCode := SockGetHostByAddr(_HostAddr,
|
|
In_Addr_Len,
|
|
AF_INET);
|
|
|
|
if (ULong(ReturnCode) <> 00) then
|
|
begin
|
|
HName := '';
|
|
Counter := 00;
|
|
|
|
While ReturnCode^.H_Name^[Counter] <> #00 do
|
|
begin
|
|
HName := HName + ReturnCode^.H_Name^[Counter];
|
|
Inc(Counter);
|
|
end; { while }
|
|
end
|
|
else HName := 'Hostname not found';
|
|
|
|
SockGetHostNameByAddr := HName;
|
|
end; { func. SockGetHostNameByAddr }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockGetHostname: ShortString;
|
|
var Counter : Longint;
|
|
sResult : Longint;
|
|
HostName : ShortString;
|
|
InAddr : TIn_Addr;
|
|
begin
|
|
FillChar(HostName, SizeOf(HostName), #00);
|
|
|
|
{$IFDEF WIN32}
|
|
sResult := GetHostName(@HostName[01], SizeOf(HostName));
|
|
{$ENDIF}
|
|
|
|
{$IFDEF OS2}
|
|
sResult := IBM_GetHostName(@HostName[01], SizeOf(HostName));
|
|
{$ENDIF}
|
|
|
|
{$IFDEF LINUX}
|
|
{!!!!!!!!!!!!!!!!!!!}
|
|
InAddr.ClassA := 127;
|
|
InAddr.ClassB := 0;
|
|
InAddr.ClassC := 0;
|
|
InAddr.ClassD := 1;
|
|
|
|
HostName := SockGetHostNameByAddr(@InAddr) + #00;
|
|
sResult := Length(HostName);
|
|
{$ENDIF}
|
|
|
|
Counter := 01;
|
|
While (Counter < SizeOf(HostName)) AND (HostName[Counter] <> #00) do
|
|
Inc(Counter);
|
|
|
|
if (Counter > 01) then
|
|
SetLength(HostName, Counter)
|
|
else HostName := 'amnesiac';
|
|
|
|
SockGetHostname := HostName;
|
|
end; { func. SockGetHostName }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockInetAddr(_s: ShortString): tIn_Addr;
|
|
begin
|
|
_s := _s + #00;
|
|
|
|
{$IFNDEF LINUX}
|
|
Result.IpAddr := INet_Addr(@_S[01]);
|
|
{$ELSE}
|
|
{$WARNING SockInetAddr function not implemented! }
|
|
Result.IpAddr := INADDR_NONE;
|
|
{$ENDIF}
|
|
end; { func. SockInetAddr }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
function SockClientAlive(_SockDesc: tSockDesc): Boolean;
|
|
var TempCH : Char;
|
|
Returncode : Longint;
|
|
TempError : Longint;
|
|
TempStr : String;
|
|
begin
|
|
Result := true;
|
|
|
|
ReturnCode := SockRecv(_SockDesc, @TempCH, SizeOf(TempCH), MSG_PEEK);
|
|
TempError := SockErrorNo;
|
|
|
|
TempStr := SockGetErrStr(TempError);
|
|
|
|
if ReturnCode = 0 then Result := false; { was: = 0 }
|
|
if (TempError <> WSAEWOULDBLOCK) AND (TempError <> 00) then
|
|
Result := false;
|
|
end; { func. SockClientAlive }
|
|
|
|
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
|
|
|
|
initialization
|
|
{!! SockInit; }
|
|
|
|
finalization
|
|
{$IFDEF WIN32}
|
|
//WsaCleanUp;
|
|
{$ENDIF}
|
|
end. { unit SockFunc }
|