Major Update:

- FunctionCore, SelectCore, SelectableCore, DeviceCore, FileCore:
  - Update Logs to show [ProcessName]/[FunctionName]
- SelectableCore:
  - Update ConnectTypeName array (more readable)
  - Return THandle on all OpenXxxx() methods
  - Do not remove select handle for UDPremoteClient (same handle as server)
  - Add correct Handle when adding RemoteClient to Selector
This commit is contained in:
Charl Wentzel
2018-11-22 11:29:55 +02:00
parent e3e5aa5258
commit 7434334280
6 changed files with 422 additions and 284 deletions

View File

@@ -17,7 +17,7 @@
//---------------------------------------------------------------------------
// Global Vars
//extern char * ProcessName;
extern char * ProcessName;
//extern CApplication * Application;
//---------------------------------------------------------------------------
@@ -93,7 +93,8 @@ bool CDeviceCore::DeviceOnline( TDevice * Device, bool Online )
// Log Event
Device->Online = Online;
if (Log) Log->Message( LogLevel, dlHigh, "%s: Device '%s' %s", Name, Device->Name, ((Online)? "online" : "offline") );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Device '%s' %s",
ProcessName, Name, Device->Name, ((Online)? "online" : "offline") );
return true;
}
//---------------------------------------------------------------------------
@@ -119,11 +120,13 @@ bool CDeviceCore::CheckReplyTimeout( int TimeoutPollStep )
// Handle No Reply / Retry
if (PollRetry < MaxRetries) {
// Log Event
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - %s timeout, retry [%d]", Name, DeviceChannel->Name, ActiveDevice->Name, PollRetry );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Channel '%s' - %s timeout, retry [%d]",
ProcessName, Name, DeviceChannel->Name, ActiveDevice->Name, PollRetry );
}
else {
// Log Event
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - %s timeout, max [%d]", Name, DeviceChannel->Name, ActiveDevice->Name, PollRetry );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Channel '%s' - %s timeout, max [%d]",
ProcessName, Name, DeviceChannel->Name, ActiveDevice->Name, PollRetry );
// Set Device Offline
DeviceOnline( ActiveDevice, false );
@@ -162,7 +165,8 @@ TDevice * CDeviceCore::AddDevice( const char * DeviceName )
}
// Report creation
if (Log) Log->Message( LogLevel, dlLow, "%s: Device added - '%s'", Name, DeviceName );
if (Log) Log->Message( LogLevel, dlLow, "%s/%s: Device added - '%s'",
ProcessName, Name, DeviceName );
return *Device;
}
@@ -315,7 +319,8 @@ TDeviceParam * CDeviceCore::AddDeviceParam( TDevice * Device, const char * Param
(*Param)->Changed = true;
// Report creation
if (Log) Log->Message( LogLevel, dlLow, "%s: Param added - '%s' (%s)", Name, ParamName, DataTypeName[DataType] );
if (Log) Log->Message( LogLevel, dlLow, "%s/%s: Param added - '%s' (%s)",
ProcessName, Name, ParamName, DataTypeName[DataType] );
return *Param;
}
@@ -386,7 +391,8 @@ bool CDeviceCore::UpdateUnsignedValue( TDeviceParam * Param, const u_int32_t Val
// Mark change & log event
Changed = true;
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %u", Name, Param->Name, ((Init)? "initialised" : "changed"), *((u_int16_t*)Param->Value) );
if (Log) Log->Message( LogLevel, dlLow, "%s/%s: '%s' %s - %u", ProcessName, Name,
Param->Name, ((Init)? "initialised" : "changed"), *((u_int16_t*)Param->Value) );
}
break;
@@ -398,7 +404,8 @@ bool CDeviceCore::UpdateUnsignedValue( TDeviceParam * Param, const u_int32_t Val
// Mark change & log event
Changed = true;
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %u", Name, Param->Name, ((Init)? "initialised" : "changed"), *((u_int32_t*)Param->Value) );
if (Log) Log->Message( LogLevel, dlLow, "%s/%s: '%s' %s - %u", ProcessName, Name,
Param->Name, ((Init)? "initialised" : "changed"), *((u_int32_t*)Param->Value) );
}
break;
@@ -410,7 +417,8 @@ bool CDeviceCore::UpdateUnsignedValue( TDeviceParam * Param, const u_int32_t Val
// Mark change & log event
Changed = true;
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %f", Name, Param->Name, ((Init)? "initialised" : "changed"), *((float*)Param->Value) );
if (Log) Log->Message( LogLevel, dlLow, "%s/%s: '%s' %s - %f", ProcessName, Name,
Param->Name, ((Init)? "initialised" : "changed"), *((float*)Param->Value) );
}
break;
@@ -445,7 +453,8 @@ bool CDeviceCore::UpdateSignedValue( TDeviceParam * Param, const int32_t Value,
// Mark change & log event
Changed = true;
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %d", Name, Param->Name, ((Init)? "initialised" : "changed"), *((int16_t*)Param->Value) );
if (Log) Log->Message( LogLevel, dlLow, "%s/%s: '%s' %s - %d", ProcessName, Name,
Param->Name, ((Init)? "initialised" : "changed"), *((int16_t*)Param->Value) );
}
break;
@@ -457,7 +466,8 @@ bool CDeviceCore::UpdateSignedValue( TDeviceParam * Param, const int32_t Value,
// Mark change & log event
Changed = true;
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %d", Name, Param->Name, ((Init)? "initialised" : "changed"), *((int32_t*)Param->Value) );
if (Log) Log->Message( LogLevel, dlLow, "%s/%s: '%s' %s - %d", ProcessName, Name, Param->Name,
((Init)? "initialised" : "changed"), *((int32_t*)Param->Value) );
}
break;
@@ -492,7 +502,8 @@ bool CDeviceCore::UpdateFloatValue( TDeviceParam * Param, const float Value, boo
// Mark change & log event
Changed = true;
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %f", Name, Param->Name, ((Init)? "initialised" : "changed"), *((float*)Param->Value) );
if (Log) Log->Message( LogLevel, dlLow, "%s/%s: '%s' %s - %f", ProcessName, Name,
Param->Name, ((Init)? "initialised" : "changed"), *((float*)Param->Value) );
}
break;
@@ -537,7 +548,8 @@ bool CDeviceCore::UpdateStringValue( TDeviceParam * Param, const char * Value, c
// Mark Change
Changed = true;
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %s", Name, Param->Name, ((Init)? "initialised" : "changed"), (char*)Param->Value );
if (Log) Log->Message( LogLevel, dlLow, "%s/%s: '%s' %s - %s", ProcessName, Name,
Param->Name, ((Init)? "initialised" : "changed"), (char*)Param->Value );
}
break;

View File

@@ -17,7 +17,7 @@
//---------------------------------------------------------------------------
// Global Vars
//extern char * ProcessName;
extern char * ProcessName;
//extern CApplication * Application;
//---------------------------------------------------------------------------
@@ -140,7 +140,8 @@ bool CFileCore::OpenFile( TFileHandle * FileHandle )
SetStartTime( &(FileHandle->PersistTime) );
// Report result
if (Log) Log->Message( LogLevel, dlHigh, "%s: File '%s' - Opened", Name, FileHandle->Name );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: File '%s' - Opened",
ProcessName, Name, FileHandle->Name );
}
}
@@ -148,7 +149,8 @@ bool CFileCore::OpenFile( TFileHandle * FileHandle )
if (!isOpen(FileHandle))
{
// Report result
if (Log) Log->Message( LogLevel, dlHigh, "%s: File '%s' - Could not open (%d) %s", Name, FileHandle->Name, errno, strerror(errno) );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: File '%s' - Could not open (%d) %s",
ProcessName, Name, FileHandle->Name, errno, strerror(errno) );
return false;
}
@@ -172,9 +174,11 @@ bool CFileCore::CloseFile( TFileHandle * FileHandle )
// Report result
if (!isOpen(FileHandle)) {
if (Log) Log->Message( LogLevel, dlHigh, "%s: File '%s' - Closed", Name, FileHandle->Name );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: File '%s' - Closed",
ProcessName, Name, FileHandle->Name );
} else {
if (Log) Log->Message( LogLevel, dlHigh, "%s: File '%s' - Could not close", Name, FileHandle->Name );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: File '%s' - Could not close",
ProcessName, Name, FileHandle->Name );
}
}
return true;
@@ -270,12 +274,14 @@ int CFileCore::Input( const char * ChannelName, const char * Data, int Len )
if (!(FileHandle = GetFile( ChannelName )))
{
// Log event
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input rejected, Channel not found", Name, ChannelName );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Channel '%s' - Input rejected, Channel not found",
ProcessName, Name, ChannelName );
return 0;
}
// Log event
Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s: Channel '%s' - IN:", Name, ChannelName );
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s/%s: Channel '%s' - IN:",
ProcessName, Name, ChannelName );
// Open file
if (!OpenFile( FileHandle )) {

View File

@@ -318,7 +318,8 @@ TChannel * CFunctionCore::AddChannel( const char * ChannelName, const bool pInpu
strcpy( (*Channel)->Name, ChannelName );
// Log Event
if (Log) Log->Message( LogLevel, dlLow, "%s: Channel '%s' - Created", Name, ChannelName );
if (Log) Log->Message( LogLevel, dlLow, "%s/%s: Channel '%s' - Created",
ProcessName, Name, ChannelName );
}
// Set parameters
@@ -360,7 +361,8 @@ bool CFunctionCore::LinkInputChannel( const char * ChannelName, const char * Out
strcpy( (*LinkedChannel)->Name, OutChannelName );
// Log Event
if (Log) Log->Message( LogLevel, dlLow, "%s: Input Linked - '%s'/'%s' <-- '%s'/'%s'", Name, Name, ChannelName, OutFunction->GetName(), OutChannelName );
if (Log) Log->Message( LogLevel, dlLow, "%s/%s: Input Linked - '%s'/'%s' <-- '%s'/'%s'",
ProcessName, Name, Name, ChannelName, OutFunction->GetName(), OutChannelName );
}
// Link Return direction as well
@@ -405,7 +407,8 @@ bool CFunctionCore::LinkOutputChannel( const char * ChannelName, const char * In
strcpy( (*LinkedChannel)->Name, InChannelName );
// Log Event
if (Log) Log->Message( LogLevel, dlLow, "%s: Output Linked - '%s'/'%s' --> '%s'/'%s'", Name, Name, ChannelName, InFunction->GetName(), InChannelName );
if (Log) Log->Message( LogLevel, dlLow, "%s/%s: Output Linked - '%s'/'%s' --> '%s'/'%s'",
ProcessName, Name, Name, ChannelName, InFunction->GetName(), InChannelName );
}
// Link return direction as well
@@ -430,12 +433,14 @@ int CFunctionCore::Input( const char * ChannelName, const char * Data, int Len )
// Get Channel
if (!(Channel = GetChannel( ChannelName ))) {
// Channel not found
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input rejected, Channel not found", Name, ChannelName );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Channel '%s' - Input rejected, Channel not found",
ProcessName, Name, ChannelName );
return 0;
}
else if (!Channel->InputEnabled) {
// Channel disabled
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input rejected, Channel input disabled", Name, ChannelName );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Channel '%s' - Input rejected, Channel input disabled",
ProcessName, Name, ChannelName );
return 0;
}
else {
@@ -443,7 +448,8 @@ int CFunctionCore::Input( const char * ChannelName, const char * Data, int Len )
if (Len == -1) {
Len = strlen( Data );
}
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s: Channel '%s' - IN:", Name, ChannelName );
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s/%s: Channel '%s' - IN:",
ProcessName, Name, ChannelName );
return Len;
}
}
@@ -460,7 +466,8 @@ int CFunctionCore::Output( const char * ChannelName, const char * Data, int Len
// Get Channel
if (!(Channel = GetChannel( ChannelName ))) {
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Output rejected, Channel not found", Name, ChannelName );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Channel '%s' - Output rejected, Channel not found",
ProcessName, Name, ChannelName );
return 0;
}
else {
@@ -483,12 +490,14 @@ int CFunctionCore::Output( const TChannel * Channel, const char * Data, int Len
// Check if enabled
if (!Channel->OutputEnabled) {
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Output rejected, Channel output disabled", Name, Channel->Name );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Channel '%s' - Output rejected, Channel output disabled",
ProcessName, Name, Channel->Name );
return 0;
}
// Log event
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s: Channel '%s' - OUT:", Name, Channel->Name );
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s/%s: Channel '%s' - OUT:",
ProcessName, Name, Channel->Name );
// Pass output to all linked inputs
if (Len == -1) {
@@ -518,7 +527,8 @@ bool CFunctionCore::PullInput( const char * ChannelName )
// Get Channel
if (!(Channel = GetChannel( ChannelName ))) {
// Channel not found
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input failed, Channel not found", Name, ChannelName );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Channel '%s' - Input failed, Channel not found",
ProcessName, Name, ChannelName );
return false;
}
else {
@@ -541,7 +551,8 @@ bool CFunctionCore::PullInput( TChannel * Channel )
// Check if enabled
if (!Channel->InputEnabled) {
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input failed, Channel input disabled", Name, Channel->Name );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Channel '%s' - Input failed, Channel input disabled",
ProcessName, Name, Channel->Name );
return false;
}
@@ -576,12 +587,14 @@ bool CFunctionCore::PullOutput( const char * ChannelName, char ** Data, int * Le
// Get Channel
if (!(Channel = GetChannel( ChannelName ))) {
// Channel not found
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Output failed, Channel not found", Name, ChannelName );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Channel '%s' - Output failed, Channel not found",
ProcessName, Name, ChannelName );
return 0;
}
else if (!Channel->InputEnabled) {
// Channel disabled
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Output failed, Channel output disabled", Name, ChannelName );
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Channel '%s' - Output failed, Channel output disabled",
ProcessName, Name, ChannelName );
return 0;
}
else {
@@ -589,7 +602,8 @@ bool CFunctionCore::PullOutput( const char * ChannelName, char ** Data, int * Le
*Data = StoredOutput;
TempLen = (*Data)? strlen(*Data) : 0;
if (Len) *Len = TempLen;
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, ((*Data)? *Data : "(NULL)"), TempLen, "%s: Channel '%s' - IN:", Name, ChannelName );
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, ((*Data)? *Data : "(NULL)"), TempLen, "%s/%s: Channel '%s' - IN:",
ProcessName, Name, ChannelName );
return Len;
}
}

View File

@@ -103,7 +103,7 @@ void CSelect::Add( int FD, bool Read, bool Write, THandle * Handle, CSelectableC
(*SelectHandle)->Handle = Handle;
(*SelectHandle)->Function = Function;
if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d], %s, %s - Created", FD,
if (Log) Log->Message( LogLevel, dlHigh, "%s/Selector: FD [%d], %s '%s' - Created", ProcessName, FD,
ConnectTypeName[((Handle)? Handle->Type : 0)], ((Handle && Handle->Name)? Handle->Name : "") );
}
else {
@@ -111,7 +111,7 @@ void CSelect::Add( int FD, bool Read, bool Write, THandle * Handle, CSelectableC
// Old handle for another function, not yet removed, remove from read/write lists
Remove( FD, true, true );
if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d], %s, %s - Removed old", FD,
if (Log) Log->Message( LogLevel, dlHigh, "%s/Selector: FD [%d], %s '%s' - Removed old", ProcessName, FD,
ConnectTypeName[((Handle)? Handle->Type : 0)], ((Handle && Handle->Name)? Handle->Name : "") );
}
@@ -126,7 +126,7 @@ void CSelect::Add( int FD, bool Read, bool Write, THandle * Handle, CSelectableC
FD_SET( FD, &ReadTestFDS );
// Log event
if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d], %s, %s - Add Read", FD,
if (Log) Log->Message( LogLevel, dlHigh, "%s/Selector: FD [%d], %s '%s' - Add Read", ProcessName, FD,
ConnectTypeName[((Handle)? Handle->Type : 0)], ((Handle && Handle->Name)? Handle->Name : "") );
}
@@ -136,7 +136,7 @@ void CSelect::Add( int FD, bool Read, bool Write, THandle * Handle, CSelectableC
FD_SET( FD, &WriteTestFDS );
// Log event
if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d], %s, %s - Add Write", FD,
if (Log) Log->Message( LogLevel, dlHigh, "%s/Selector: FD [%d], %s '%s' - Add Write", ProcessName, FD,
ConnectTypeName[((Handle)? Handle->Type : 0)], ((Handle && Handle->Name)? Handle->Name : "") );
}
@@ -167,7 +167,7 @@ void CSelect::Remove( int FD, bool Read, bool Write )
FD_CLR( FD, &ReadTestFDS);
// Log event
if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d], %s, %s - Remove Read", FD,
if (Log) Log->Message( LogLevel, dlHigh, "%s/Selector: FD [%d], %s '%s' - Remove Read", ProcessName, FD,
ConnectTypeName[((Handle)? Handle->Type : 0)], ((Handle && Handle->Name)? Handle->Name : "") );
}
@@ -177,7 +177,7 @@ void CSelect::Remove( int FD, bool Read, bool Write )
FD_CLR( FD, &WriteTestFDS);
// Log event
if (Log) Log->Message( LogLevel, dlHigh, "Selector: FD [%d], %s, %s - Remove Write", FD,
if (Log) Log->Message( LogLevel, dlHigh, "%s/Selector: FD [%d], %s '%s' - Remove Write", ProcessName, FD,
ConnectTypeName[((Handle)? Handle->Type : 0)], ((Handle && Handle->Name)? Handle->Name : "") );
}
// Handle will be removed in Test() if both Read & Write flags are false
@@ -200,7 +200,7 @@ bool CSelect::Test()
Events = select( MaxFD, &ReadFDS, &WriteFDS, (fd_set*)NULL, &STimeout );
if (Events < 0)
{
if (Log) Log->Message( LogLevel, dlHigh, "Selector: Select operation failed" );
if (Log) Log->Message( LogLevel, dlHigh, "%s/Selector: Select operation failed", ProcessName );
return false;
}

File diff suppressed because it is too large Load Diff

View File

@@ -18,9 +18,9 @@
// Types required for connections
typedef enum { ctNone = 0, ctSerial = 1, ctLinePrinter = 2, ctForkPipe = 3, ctUNIXserver = 4, ctUNIXclient = 5, ctUNIXremote = 6,
ctUDPserver = 7, ctUDPclient = 8, ctUDPremote = 9, ctTCPserver = 10, ctTCPremote = 11, ctTCPclient = 12 } EConnectType;
const char ConnectTypeName[][20] = { "None", "Serial", "LinePrinter", "ForkPipe", "UNIXserver", "UNIXclient", "UNIXremote",
"UDPserver", "UDPclient", "UDPremote", "TCPserver", "TCPremote", "TCPclient" };
ctUDPserver = 7, ctUDPclient = 8, ctUDPremote = 9, ctTCPserver = 10, ctTCPclient = 11, ctTCPremote = 12 } EConnectType;
const char ConnectTypeName[][20] = { "None", "Serial Port", "Line Printer", "Fork Pipe", "UNIX Server", "UNIX Client", "UNIX Remote Client",
"UDP Server", "UDP Client", "UDP Remote Client", "TCP Server", "TCP Client", "TCP Remote Client" };
typedef enum { csNone = 0, csOpenRequest = 1, csWaitingtoOpen = 2, csOpen = 3, csDataWaiting = 4, csClosed = 5, csFailed = 6 } EConnectState;
const char ConnectStateName[][15] = { "None", "OpenRequest", "WaitingToOpen", "Open", "DataWaiting", "Closed", "Failed" };
@@ -205,26 +205,26 @@ protected:
}
// Port Operations
int OpenSerialPort( THandle * Handle );
bool WriteSerialConfig( THandle * Handle );
bool ReadSerialConfig( THandle * Handle );
THandle * OpenSerialPort( THandle * Handle );
bool WriteSerialConfig( THandle * Handle );
bool ReadSerialConfig( THandle * Handle );
int OpenLinePrinterPort( THandle * Handle );
THandle * OpenLinePrinterPort( THandle * Handle );
// File Socket Operations
int OpenForkPipe( THandle * Handle );
int OpenUNIXserverSocket( THandle * Handle );
int OpenUNIXclientSocket( THandle * Handle );
int OpenUNIXremoteSocket( THandle * Handle );
THandle * OpenForkPipe( THandle * Handle );
THandle * OpenUNIXserverSocket( THandle * Handle );
THandle * OpenUNIXclientSocket( THandle * Handle );
THandle * OpenUNIXremoteSocket( THandle * Handle );
// Socket Operations
bool ResolveAddress( THandle * Handle, bool DelayResolve );
int OpenUDPserverSocket( THandle * Handle, bool DelayResolve );
int OpenUDPremoteSocket( THandle * Handle, char * RemoteAddr, char * RemotePort );
int OpenUDPclientSocket( THandle * Handle, bool DelayResolve );
int OpenTCPserverSocket( THandle * Handle, bool DelayResolve );
int OpenTCPremoteSocket( THandle * Handle );
int OpenTCPclientSocket( THandle * Handle, bool DelayResolve );
THandle * OpenUDPserverSocket( THandle * Handle, bool DelayResolve );
THandle * OpenUDPremoteSocket( THandle * Handle, char * RemoteAddr, char * RemotePort );
THandle * OpenUDPclientSocket( THandle * Handle, bool DelayResolve );
THandle * OpenTCPserverSocket( THandle * Handle, bool DelayResolve );
THandle * OpenTCPremoteSocket( THandle * Handle );
THandle * OpenTCPclientSocket( THandle * Handle, bool DelayResolve );
// Mutual Operations
int ReadFromFD( int FD, char * Data, int MaxLen );