Major Update:

- FunctionCore
  - Replace Channel->Ready with Channel->State (off/waiting/ready)
  - Add Function reference to Handle
- SelectableBare/Core:
  - Implement async address resolve with event handling
    - Create ResolveHandler() signal handler (friend) function
  - Change Create/Remove/DestroyHandle() methods to virtual methods
    - Move socket specific code to SelectableCore
  - Rename ChangeState() to virtual HandleState()
  - Move ClearHandle() from SelectableBare -> SelectableCore
  - Implement new/delete from THandle
  - Set max TCP SYN count on connect
This commit is contained in:
Charl Wentzel
2019-06-09 22:05:27 +02:00
parent 08fce64629
commit bde14a13da
8 changed files with 360 additions and 166 deletions

View File

@@ -10,6 +10,8 @@
// Standard C/C++ Libraries
#include <ctype.h>
#include <signal.h>
#include <netdb.h>
// redA Libraries
#include "FunctionCore.h"
@@ -44,13 +46,14 @@ const char ConnectStateName[][15] = { "None", "OpenRequest", "WaitingToOpen", "O
// Previews
typedef struct SSelectHandle TSelectHandle;
typedef struct SHandle THandle;
typedef struct SResolveReq TResolveReq;
class CSelect;
class CSelectableBare;
class CSelectableCore;
// Callback function for handle events
typedef void (*FHandleCallback)( CSelectableBare * Function, THandle * Handle, EConnectState State );
typedef void (*FHandleCallback)( CSelectableBare * Function, THandle * Handle, EConnectState OldState );
//---------------------------------------------------------------------------
@@ -68,7 +71,6 @@ struct SSelectHandle {
// List
TSelectHandle * Next = NULL;
};
//---------------------------------------------------------------------------
// List or Handles for Selectable Function Object
@@ -76,6 +78,7 @@ struct SHandle {
// Description
char * Name = NULL;
EConnectType Type = ctNone;
CSelectableBare * Function = NULL;
// State
int FD = -1;
@@ -103,7 +106,10 @@ struct SHandle {
struct addrinfo * AddressInfo = NULL; // Current selected IP Address
bool AddressFailed = false; // Indicate failure to connect to address
short Queue = 2; // Max waiting connections
long ResolveDelay = 0; // Delay before resolving hostname via DNS
TResolveReq * ResolveReq = NULL; // DNS resolve request
bool Resolving = false; // Busy resolving address
// Serial Port config
bool SerialConfig = false;
@@ -132,6 +138,16 @@ struct SHandle {
THandle * Parent = NULL;
THandle * Next = NULL;
};
//---------------------------------------------------------------------------
struct SResolveReq {
THandle * Handle = NULL;
gaicb * Request = NULL;
};
//---------------------------------------------------------------------------
// Resolving
void ResolveHandler( int Signal, siginfo_t * SignalInfo, void * Context );
//---------------------------------------------------------------------------
@@ -192,9 +208,9 @@ protected:
CSelect * Selector = NULL;
// Managing File Handles
bool RemoveHandle( THandle * Handle );
bool DestroyHandle( THandle * Handle );
bool ChangeState( THandle * Handle, EConnectState State );
virtual bool RemoveHandle( THandle * Handle );
virtual bool DestroyHandle( THandle * Handle );
virtual bool HandleState( THandle * Handle, EConnectState State );
// Get Parameters
inline int GetFD( const char * HandleName ) {
@@ -241,7 +257,7 @@ public:
}
// General port parameters
THandle * CreateHandle( const char * HandleName, bool CreateChannel );
virtual THandle * CreateHandle( const char * HandleName, bool CreateChannel );
virtual CDataMember * GetHandleAddress( THandle * Handle, const char * HandleRef );
bool SetCallback( THandle * Handle, EConnectState pState, FHandleCallback pCallback );
@@ -249,9 +265,6 @@ public:
bool SetInBuffer( THandle * Handle, int InBufSize, int InTimeout, const char * InMarker, int InMarkerLen );
bool SetOutBuffer( THandle * Handle, int OutBufSize );
// Specific port parameters
bool ClearHandle( THandle * Handle );
// FD Operations
virtual int Open( THandle * Handle, bool DelayResolve = false ) = 0;
virtual bool Close( THandle * Handle, bool QuickReopen );
@@ -291,6 +304,8 @@ public:
class CSelectableCore : public CSelectableBare
{
protected:
struct sigaction ResolveAct;
// Port Operations
THandle * OpenSerialPort( THandle * Handle );
bool WriteSerialConfig( THandle * Handle );
@@ -306,6 +321,11 @@ protected:
// Socket Operations
bool ResolveAddress( THandle * Handle, bool DelayResolve );
bool HandleResolve( THandle * Handle );
bool DestroyResolveReq( THandle * Handle, bool DestroyResult );
// Managing File Handles
virtual bool DestroyHandle( THandle * Handle );
THandle * OpenUDPserverSocket( THandle * Handle, bool DelayResolve );
THandle * OpenUDPremoteSocket( THandle * Handle, char * RemoteAddr, char * RemotePort );
@@ -330,6 +350,8 @@ public:
virtual bool Init( CDataMember * FunctionConfig );
// Specific port parameters
bool ClearHandle( THandle * Handle );
bool SetSerialHandle( THandle * Handle, const char * FileName );
bool SetSerialHandleConfig( THandle * Handle, int Baudrate, short DataBits, short Parity, short StopBits, short FlowCtrl, int DataWait );
bool SetLinePrinterHandle( THandle * Handle, const char * FileName );
@@ -346,6 +368,8 @@ public:
// Function Interface
virtual int OutputHandle( THandle * Handle, const char * Data, int Len );
virtual bool Process();
friend void ResolveHandler( int Signal, siginfo_t * SignalInfo, void * Context );
};
//---------------------------------------------------------------------------