Use this function and add the following units: wsports and snmp
function IsPortFree(Prt: Integer): Boolean;
var p: TWSPorts;
begin
p := TWSPorts.Create;
p.Refresh;
if p.PortInUse(Prt) then Result:= False else Result:= True;
p.Free;
end;
//
// © 2000 Epsylon Software Development
//
// WSPorts.pas is based on NetView Version 1.0 (Main.pas)
//
// written by Crits Vadim
//
unit WSPorts;
interface
uses
Windows, SysUtils, Classes, WinSock, Snmp;
type
TWSPorts = class(TObject)
private
{ Private declarations }
FPorts: TList;
procedure EnumPorts;
function GetPortCount: Integer;
function GetPort(index: Integer): Integer;
public
{ Public declarations }
constructor Create;
destructor Destroy; override;
procedure GetUsedPorts(sl: TStrings);
function PortInUse(port: Integer): Boolean;
procedure Refresh;
property PortCount: Integer read GetPortCount;
property Ports[index: Integer]: Integer read GetPort;
end;
implementation
function SnmpExtensionInit(dwTimeZeroReference: DWORD; hPollForTrapEvent:
PHandle;
supportedView: PAsnObjectIdentifier): BOOL; stdcall;
external 'inetmib1.dll' name 'SnmpExtensionInit';
function SnmpExtensionQuery(requestType: BYTE; variableBindings:
PRFC1157VarBindList;
errorStatus, errorIndex: PAsnInteger): BOOL; stdcall;
external 'inetmib1.dll' name 'SnmpExtensionQuery';
const
tcpidentifiers: array[0..9] of UINT = (1, 3, 6, 1, 2, 1, 6, 13, 1, 1);
udpidentifiers: array[0..9] of UINT = (1, 3, 6, 1, 2, 1, 7, 5, 1, 1);
function SortPorts(Item1, Item2: Pointer): Integer;
begin
result := Integer(Item1) - Integer(Item2);
end;
{ TWSPort }
constructor TWSPorts.Create;
var WSAData: TWSAData;
begin
inherited;
if WSAStartup($0101, WSAData) <> 0 then
begin
raise EExternal.Create('Could not initialize Winsock');
Exit;
end;
FPorts := TList.Create;
EnumPorts;
end;
destructor TWSPorts.Destroy;
begin
FPorts.Free;
WSACleanup;
inherited;
end;
procedure TWSPorts.EnumPorts;
var hTrapEvent: THandle;
hIdentifier: TAsnObjectIdentifier;
bindList: TRFC1157VarBindList;
bindEntry: TRFC1157VarBind;
errorStatus, errorIndex: TAsnInteger;
error: Boolean;
begin
FPorts.Clear;
if not SnmpExtensionInit(GetCurrentTime, @hTrapEvent, @hIdentifier) then
Exit;
// TCP connections
bindList.list := @bindEntry;
bindList.len := 1;
bindEntry.name.idLength := 10;
bindEntry.name.ids := @tcpidentifiers;
error := False;
while not error do
begin
if not SnmpExtensionQuery(ASN_RFC1157_GETNEXTREQUEST,
@bindList, @errorStatus, @errorIndex) then
begin
error := True;
Continue;
end;
if bindEntry.name.idLength < 10 then Break;
if bindEntry.name.ids[9] = 3 then
if not PortInUse(bindEntry.value.number) then
FPorts.Add(Pointer(bindEntry.value.number));
end;
// UDP connections
bindList.list := @bindEntry;
bindList.len := 1;
bindEntry.name.idLength := 10;
bindEntry.name.ids := @udpidentifiers;
error := False;
while not error do
begin
if not SnmpExtensionQuery(ASN_RFC1157_GETNEXTREQUEST,
@bindList, @errorStatus, @errorIndex) then
begin
error := True;
Continue;
end;
if bindEntry.name.idLength < 10 then Break;
if bindEntry.name.ids[9] = 2 then
if not PortInUse(bindEntry.value.number) then
FPorts.Add(Pointer(bindEntry.value.number));
end;
FPorts.Sort(SortPorts);
end;
function TWSPorts.GetPort(index: Integer): Integer;
begin
Result := Integer(FPorts[index]);
end;
function TWSPorts.GetPortCount: Integer;
begin
Result := FPorts.Count;
end;
procedure TWSPorts.GetUsedPorts(sl: TStrings);
var i: Integer;
begin
for i := 0 to FPorts.Count - 1 do
sl.Add(IntToStr(Integer(FPorts[i])));
end;
function TWSPorts.PortInUse(port: Integer): Boolean;
begin
Result := FPorts.IndexOf(Pointer(port)) <> -1;
end;
procedure TWSPorts.Refresh;
begin
EnumPorts;
end;
end.
{*******************************************************}
{ }
{ Delphi Runtime Library }
{ SNMP Interface Unit }
{ }
{ Copyright (c) 1999 Crits Vadim }
{ }
{*******************************************************}
unit Snmp;
interface
uses Windows;
///////////////////////////////////////////////////////////////////////////////
//
//
// SNMP API return code definitions
//
//
//
///////////////////////////////////////////////////////////////////////////////
const
SNMPAPI_NOERROR = INTEGER(TRUE);
SNMPAPI_ERROR = INTEGER(FALSE);
///////////////////////////////////////////////////////////////////////////////
//
//
// SNMP API error code definitions
//
//
//
///////////////////////////////////////////////////////////////////////////////
SNMP_MEM_ALLOC_ERROR = 1;
///////////////////////////////////////////////////////////////////////////////
//
//
// BER API error code definitions
//
//
//
///////////////////////////////////////////////////////////////////////////////
SNMP_BERAPI_INVALID_LENGTH = 10;
SNMP_BERAPI_INVALID_TAG = 11;
SNMP_BERAPI_OVERFLOW = 12;
SNMP_BERAPI_SHORT_BUFFER = 13;
SNMP_BERAPI_INVALID_OBJELEM = 14;
///////////////////////////////////////////////////////////////////////////////
//
//
// PDU API error code definitions
//
//
//
///////////////////////////////////////////////////////////////////////////////
SNMP_PDUAPI_UNRECOGNIZED_PDU = 20;
SNMP_PDUAPI_INVALID_ES = 21;
SNMP_PDUAPI_INVALID_GT = 22;
///////////////////////////////////////////////////////////////////////////////
//
//
// AUTH API error code definitions
//
//
//
///////////////////////////////////////////////////////////////////////////////
SNMP_AUTHAPI_INVALID_VERSION = 30;
SNMP_AUTHAPI_INVALID_MSG_TYPE = 31;
SNMP_AUTHAPI_TRIV_AUTH_FAILED = 32;
///////////////////////////////////////////////////////////////////////////////
//
//
// SNMP PDU error status definitions
//
//
//
///////////////////////////////////////////////////////////////////////////////
SNMP_ERRORSTATUS_NOERROR = 0;
SNMP_ERRORSTATUS_TOOBIG = 1;
SNMP_ERRORSTATUS_NOSUCHNAME = 2;
SNMP_ERRORSTATUS_BADVALUE = 3;
SNMP_ERRORSTATUS_READONLY = 4;
SNMP_ERRORSTATUS_GENERR = 5;
///////////////////////////////////////////////////////////////////////////////
//
//
// SNMP PDU generic trap definitions
//
//
//
///////////////////////////////////////////////////////////////////////////////
SNMP_GENERICTRAP_COLDSTART = 0;
SNMP_GENERICTRAP_WARMSTART = 1;
SNMP_GENERICTRAP_LINKDOWN = 2;
SNMP_GENERICTRAP_LINKUP = 3;
SNMP_GENERICTRAP_AUTHFAILURE = 4;
SNMP_GENERICTRAP_EGPNEIGHLOSS = 5;
SNMP_GENERICTRAP_ENTERSPECIFIC = 6;
///////////////////////////////////////////////////////////////////////////////
//
//
// BER encoding definitions
//
//
//
///////////////////////////////////////////////////////////////////////////////
ASN_UNIVERSAL = $00;
ASN_APPLICATION = $40;
ASN_CONTEXTSPECIFIC = $80;
ASN_PRIVATE = $C0;
ASN_PRIMATIVE = $00;
ASN_CONSTRUCTOR = $20;
///////////////////////////////////////////////////////////////////////////////
//
//
// ASN.1 simple types
//
//
//
///////////////////////////////////////////////////////////////////////////////
ASN_INTEGER = (ASN_UNIVERSAL or ASN_PRIMATIVE or $02);
ASN_OCTETSTRING = (ASN_UNIVERSAL or ASN_PRIMATIVE or $04);
ASN_NULL = (ASN_UNIVERSAL or ASN_PRIMATIVE or $05);
ASN_OBJECTIDENTIFIER = (ASN_UNIVERSAL or ASN_PRIMATIVE or $06);
///////////////////////////////////////////////////////////////////////////////
//
//
// ASN.1 constructor types
//
//
//
///////////////////////////////////////////////////////////////////////////////
ASN_SEQUENCE = (ASN_UNIVERSAL or ASN_CONSTRUCTOR or $10);
ASN_SEQUENCEOF = ASN_SEQUENCE;
///////////////////////////////////////////////////////////////////////////////
//
//
// ASN.1 application specific primatives
//
//
//
///////////////////////////////////////////////////////////////////////////////
ASN_RFC1155_IPADDRESS = (ASN_APPLICATION or ASN_PRIMATIVE or $00);
ASN_RFC1155_COUNTER = (ASN_APPLICATION or ASN_PRIMATIVE or $01);
ASN_RFC1155_GAUGE = (ASN_APPLICATION or ASN_PRIMATIVE or $02);
ASN_RFC1155_TIMETICKS = (ASN_APPLICATION or ASN_PRIMATIVE or $03);
ASN_RFC1155_OPAQUE = (ASN_APPLICATION or ASN_PRIMATIVE or $04);
ASN_RFC1213_DISPSTRING = ASN_OCTETSTRING;
///////////////////////////////////////////////////////////////////////////////
//
//
// ASN.1 application specific constructors
//
//
//
///////////////////////////////////////////////////////////////////////////////
ASN_RFC1157_GETREQUEST = ASN_CONTEXTSPECIFIC or ASN_CONSTRUCTOR or
$00;
ASN_RFC1157_GETNEXTREQUEST = ASN_CONTEXTSPECIFIC or ASN_CONSTRUCTOR or
$01;
ASN_RFC1157_GETRESPONSE = ASN_CONTEXTSPECIFIC or ASN_CONSTRUCTOR or
$02;
ASN_RFC1157_SETREQUEST = ASN_CONTEXTSPECIFIC or ASN_CONSTRUCTOR or
$03;
ASN_RFC1157_TRAP = ASN_CONTEXTSPECIFIC or ASN_CONSTRUCTOR or
$04;
///////////////////////////////////////////////////////////////////////////////
//
//
// SNMP ASN type definitions
//
//
//
///////////////////////////////////////////////////////////////////////////////
type
PAsnOctetString = ^TAsnOctetString;
TAsnOctetString = packed record
stream: ^BYTE;
length: UINT;
dynam: BOOL;
end;
PIdentifiers = ^TIdentifiers;
TIdentifiers = array[0..9] of UINT;
PAsnObjectIdentifier = ^TAsnObjectIdentifier;
TAsnObjectIdentifier = packed record
idLength: UINT;
ids: PIdentifiers;
end;
PAsnInteger = ^TAsnInteger;
TAsnInteger = Longint;
TAsnCounter = DWORD;
TAsnGauge = DWORD;
TAsnTimeticks = DWORD;
TAsnSequence = TAsnOctetString;
TAsnImplicitSequence = TAsnOctetString;
TAsnIPAddress = TAsnOctetString;
TAsnDisplayString = TAsnOctetString;
TAsnOpaque = TAsnOctetString;
TAsnObjectName = TAsnObjectIdentifier;
TAsnNetworkAddress = TAsnIPAddress;
PAsnAny = ^TAsnAny;
TAsnAny = packed record
asnType: BYTE;
align : array[0..2] of BYTE;//size 13 byte necessary 16 byte
case Integer of
0: (number: TAsnInteger);
1: (str: TAsnOctetString);
2: (obj: TAsnObjectIdentifier);
3: (sequence: TAsnSequence);
4: (address: TAsnIPAddress);
5: (counter: TAsnCounter);
6: (gauge: TAsnGauge);
7: (ticks: TAsnTimeticks);
8: (arbitrary: TAsnOpaque);
end;
TAsnObjectSyntax = TAsnAny;
///////////////////////////////////////////////////////////////////////////////
//
//
// SNMP API type definitions
//
//
//
///////////////////////////////////////////////////////////////////////////////
PRFC1157VarBind = ^TRFC1157VarBind;
TRFC1157VarBind = packed record
name: TAsnObjectName;
value: TAsnObjectSyntax;
end;
PRFC1157VarBindList = ^TRFC1157VarBindList;
TRFC1157VarBindList = packed record
list: PRFC1157VarBind;
len: UINT;
end;
///////////////////////////////////////////////////////////////////////////////
//
//
// SNMP API prototypes
//
//
//
///////////////////////////////////////////////////////////////////////////////
function SnmpUtilOidCpy(DstObjId: PAsnObjectIdentifier; SrcObjId:
PAsnObjectIdentifier): Integer; stdcall;
function SnmpUtilOidAppend(DstObjId: PAsnObjectIdentifier; SrcObjId:
PAsnObjectIdentifier): Integer; stdcall;
function SnmpUtilOidNCmp(ObjIdA, ObjIdB: PAsnObjectIdentifier; Len: UINT):
Integer; stdcall;
function SnmpUtilOidCmp(ObjIdA, ObjIdB: PAsnObjectIdentifier): Integer;
stdcall;
procedure SnmpUtilOidFree(ObjId: PAsnObjectIdentifier); stdcall;
function SnmpUtilVarBindListCpy(DstVarBindList, SrcVarBindList:
PRFC1157VarBindList): Integer; stdcall;
function SnmpUtilVarBindCpy(DstVarBind, SrcVarBind: PRFC1157VarBind):
Integer; stdcall;
procedure SnmpUtilVarBindListFree(VarBindList: PRFC1157VarBindList);
stdcall;
procedure SnmpUtilVarBindFree(VarBind: PRFC1157VarBind); stdcall;
procedure SnmpUtilPrintAsnAny(Any: PAsnAny); stdcall;
procedure SnmpUtilMemFree(Addr: Pointer); stdcall;
function SnmpUtilMemAlloc(Size: UINT): Pointer; stdcall;
function SnmpUtilMemReAlloc(Addr: Pointer; NewSize: UINT): Pointer;
stdcall;
///////////////////////////////////////////////////////////////////////////////
//
//
// SNMP debugging definitions
//
//
//
///////////////////////////////////////////////////////////////////////////////
const
SNMP_LOG_SILENT = $0;
SNMP_LOG_FATAL = $1;
SNMP_LOG_ERROR = $2;
SNMP_LOG_WARNING = $3;
SNMP_LOG_TRACE = $4;
SNMP_LOG_VERBOSE = $5;
///////////////////////////////////////////////////////////////////////////////
//
//
// Miscellaneous definitions
//
//
//
///////////////////////////////////////////////////////////////////////////////
const
SNMP_MAX_OID_LEN = $7F00;
implementation
const
snmplib = 'Snmpapi.dll';
function SnmpUtilOidCpy; external snmplib name 'SnmpUtilOidCpy';
function SnmpUtilOidAppend; external snmplib name
'SnmpUtilOidAppend';
function SnmpUtilOidNCmp; external snmplib name 'SnmpUtilOidNCmp';
function SnmpUtilOidCmp; external snmplib name 'SnmpUtilOidCmp';
procedure SnmpUtilOidFree; external snmplib name 'SnmpUtilOidFree';
function SnmpUtilVarBindListCpy; external snmplib name
'SnmpUtilVarBindListCpy';
function SnmpUtilVarBindCpy; external snmplib name
'SnmpUtilVarBindCpy';
procedure SnmpUtilVarBindListFree; external snmplib name
'SnmpUtilVarBindListFree';
procedure SnmpUtilVarBindFree; external snmplib name
'SnmpUtilVarBindFree';
procedure SnmpUtilPrintAsnAny; external snmplib name
'SnmpUtilPrintAsnAny';
procedure SnmpUtilMemFree; external snmplib name 'SnmpUtilMemFree';
function SnmpUtilMemAlloc; external snmplib name 'SnmpUtilMemAlloc';
function SnmpUtilMemReAlloc; external snmplib name
'SnmpUtilMemReAlloc';
end.
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be