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:
@@ -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 );
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user