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:
@@ -40,13 +40,62 @@ CFunctionCore * NewSelectableCore( const char * Name ) {
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Resolve action handlder
|
||||
void ResolveHandler( int Signal, siginfo_t * SignalInfo, void * Context )
|
||||
{
|
||||
TResolveReq * ResolveReq;
|
||||
THandle * Handle;
|
||||
|
||||
// Validate signal
|
||||
if ((SignalInfo->si_code != SI_ASYNCNL) ||
|
||||
(SignalInfo->si_signo != SIGRTMIN))
|
||||
return;
|
||||
|
||||
// Get Handle & Request
|
||||
ResolveReq = (TResolveReq*)(SignalInfo->si_value.sival_ptr);
|
||||
Handle = ResolveReq->Handle;
|
||||
|
||||
((CSelectableCore*)Handle->Function)->HandleResolve( Handle );
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
CSelectableCore::CSelectableCore( const char * pName, const char * pType ) : CSelectableBare( pName, pType )
|
||||
{
|
||||
// Configure resolve signal handler
|
||||
ResolveAct.sa_sigaction = &ResolveHandler;
|
||||
sigemptyset( &ResolveAct.sa_mask );
|
||||
ResolveAct.sa_flags = SA_SIGINFO;
|
||||
|
||||
sigaction( SIGRTMIN, &ResolveAct, NULL );
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
CSelectableCore::~CSelectableCore()
|
||||
{
|
||||
THandle * NextHandle = NULL;
|
||||
bool Result;
|
||||
|
||||
// Destroy File Handles
|
||||
while (FirstHandle)
|
||||
{
|
||||
// Close active resolve request
|
||||
if (FirstHandle->Resolving && FirstHandle->ResolveReq) {
|
||||
if ((Result = gai_cancel( FirstHandle->ResolveReq->Request )) != 0) {
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Error canceling Host Name resolve [%s:%s] (%s)",
|
||||
ProcessName, Name, FirstHandle->Name, FirstHandle->HostName, FirstHandle->PortName, gai_strerror(Result) );
|
||||
DestroyResolveReq( FirstHandle, true );
|
||||
HandleState( FirstHandle, csFailed );
|
||||
}
|
||||
}
|
||||
|
||||
// Close handle if open
|
||||
if ((FirstHandle->State == csOpen) || (FirstHandle->State == csWaitingtoOpen))
|
||||
Close( FirstHandle, false );
|
||||
|
||||
NextHandle = FirstHandle->Next;
|
||||
DestroyHandle( FirstHandle );
|
||||
FirstHandle = NextHandle;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -227,6 +276,87 @@ bool CSelectableCore::Init( CDataMember * FunctionConfig )
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CSelectableCore::DestroyHandle( THandle * Handle )
|
||||
{
|
||||
int Result;
|
||||
|
||||
// Validate Handle
|
||||
if (!Handle)
|
||||
return false;
|
||||
|
||||
// Destroy Resolve request
|
||||
if (Handle->Resolving && Handle->ResolveReq) {
|
||||
if ((Result = gai_cancel( Handle->ResolveReq->Request )) != 0) {
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Error canceling Host Name resolve [%s:%s] (%s)",
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName, gai_strerror(Result) );
|
||||
}
|
||||
DestroyResolveReq( Handle, true );
|
||||
}
|
||||
|
||||
// Clear parameters
|
||||
if (Handle->Name)
|
||||
free( Handle->Name );
|
||||
if (Handle->Path)
|
||||
free( Handle->Path );
|
||||
if (Handle->HostName)
|
||||
free( Handle->HostName );
|
||||
if (Handle->PortName)
|
||||
free( Handle->PortName );
|
||||
if (Handle->AddressList)
|
||||
freeaddrinfo( Handle->AddressList );
|
||||
|
||||
// Destroy Buffers
|
||||
if (Handle->InBuffer)
|
||||
delete Handle->InBuffer;
|
||||
if (Handle->OutBuffer)
|
||||
delete Handle->OutBuffer;
|
||||
|
||||
// Clear Input Markers
|
||||
if (Handle->InMarker)
|
||||
free( Handle->InMarker );
|
||||
|
||||
// Destroy Pointer
|
||||
delete Handle;
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CSelectableCore::ClearHandle( THandle * Handle )
|
||||
{
|
||||
// Validate
|
||||
if (!Handle) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Reset Type related parameters
|
||||
if (Handle->Path) {
|
||||
free( Handle->Path );
|
||||
Handle->Path = NULL;
|
||||
}
|
||||
if (Handle->HostName) {
|
||||
free( Handle->HostName );
|
||||
Handle->HostName = NULL;
|
||||
}
|
||||
if (Handle->PortName) {
|
||||
free( Handle->PortName );
|
||||
Handle->PortName = NULL;
|
||||
}
|
||||
if (Handle->AddressList) {
|
||||
freeaddrinfo( Handle->AddressList );
|
||||
Handle->AddressList = NULL;
|
||||
Handle->AddressInfo = NULL;
|
||||
}
|
||||
|
||||
// Reset Parameters
|
||||
Handle->Type = ctNone;
|
||||
|
||||
// Log event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Set as None",
|
||||
ProcessName, Name, Handle->Name );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CSelectableCore::SetSerialHandle( THandle * Handle, const char * FileName )
|
||||
{
|
||||
// Validate
|
||||
@@ -427,7 +557,7 @@ THandle * CSelectableCore::OpenSerialPort( THandle * Handle )
|
||||
}
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csOpen );
|
||||
HandleState( Handle, csOpen );
|
||||
return Handle;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -470,7 +600,7 @@ THandle * CSelectableCore::OpenLinePrinterPort( THandle * Handle )
|
||||
}
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csOpen );
|
||||
HandleState( Handle, csOpen );
|
||||
return Handle;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -572,7 +702,7 @@ THandle * CSelectableCore::OpenForkPipe( THandle * Handle )
|
||||
}
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csOpen );
|
||||
HandleState( Handle, csOpen );
|
||||
return Handle;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -596,7 +726,7 @@ THandle * CSelectableCore::OpenUNIXserverSocket( THandle * Handle )
|
||||
ProcessName, Name, Handle->Name, Handle->Path, strerror(errno) );
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -608,7 +738,7 @@ THandle * CSelectableCore::OpenUNIXserverSocket( THandle * Handle )
|
||||
ProcessName, Name, Handle->Name, Handle->Path, strerror(errno) );
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
};
|
||||
|
||||
@@ -633,7 +763,7 @@ THandle * CSelectableCore::OpenUNIXserverSocket( THandle * Handle )
|
||||
close( Handle->FD );
|
||||
Handle->FD = -1;
|
||||
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
};
|
||||
|
||||
@@ -648,7 +778,7 @@ THandle * CSelectableCore::OpenUNIXserverSocket( THandle * Handle )
|
||||
close( Handle->FD );
|
||||
Handle->FD = -1;
|
||||
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
};
|
||||
|
||||
@@ -662,7 +792,7 @@ THandle * CSelectableCore::OpenUNIXserverSocket( THandle * Handle )
|
||||
}
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csOpen );
|
||||
HandleState( Handle, csOpen );
|
||||
return Handle;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -688,7 +818,7 @@ THandle * CSelectableCore::OpenUNIXclientSocket( THandle * Handle )
|
||||
ProcessName, Name, Handle->Name, Handle->Path, strerror(errno) );
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
};
|
||||
|
||||
@@ -715,7 +845,7 @@ THandle * CSelectableCore::OpenUNIXclientSocket( THandle * Handle )
|
||||
}
|
||||
|
||||
// Set status
|
||||
ChangeState( Handle, csWaitingtoOpen );
|
||||
HandleState( Handle, csWaitingtoOpen );
|
||||
return Handle;
|
||||
}
|
||||
else
|
||||
@@ -734,7 +864,7 @@ THandle * CSelectableCore::OpenUNIXclientSocket( THandle * Handle )
|
||||
Handle->FD = -1;
|
||||
Handle->AddressFailed = true;
|
||||
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -749,7 +879,7 @@ THandle * CSelectableCore::OpenUNIXclientSocket( THandle * Handle )
|
||||
}
|
||||
|
||||
// Set status
|
||||
ChangeState( Handle, csOpen );
|
||||
HandleState( Handle, csOpen );
|
||||
return Handle;
|
||||
}
|
||||
}
|
||||
@@ -846,7 +976,7 @@ THandle * CSelectableCore::OpenUNIXremoteSocket( THandle * Handle )
|
||||
ProcessName, Name, Handle->Name, Handle->Path );
|
||||
|
||||
// Update state
|
||||
ChangeState( Handle, csOpen );
|
||||
HandleState( Handle, csOpen );
|
||||
return Handle;
|
||||
}
|
||||
}
|
||||
@@ -856,12 +986,17 @@ THandle * CSelectableCore::OpenUNIXremoteSocket( THandle * Handle )
|
||||
|
||||
bool CSelectableCore::ResolveAddress( THandle * Handle, bool DelayResolve )
|
||||
{
|
||||
struct addrinfo hints;
|
||||
int result;
|
||||
struct addrinfo * Hints;
|
||||
TResolveReq * ResolveReq;
|
||||
sigevent ResolveEvt;
|
||||
int Result;
|
||||
|
||||
// Ignore if busy resolving
|
||||
if (Handle->Resolving)
|
||||
return false;
|
||||
|
||||
// Check if resolved address available
|
||||
if (Handle->AddressInfo)
|
||||
{
|
||||
if (Handle->AddressInfo) {
|
||||
// Return if address still valid
|
||||
if (!Handle->AddressFailed)
|
||||
return true;
|
||||
@@ -892,47 +1027,117 @@ bool CSelectableCore::ResolveAddress( THandle * Handle, bool DelayResolve )
|
||||
}
|
||||
|
||||
// Set address specification
|
||||
memset( &hints, 0, sizeof hints );
|
||||
Hints = (struct addrinfo*)calloc( 1, sizeof(struct addrinfo) );
|
||||
if ((Handle->Type == ctTCPserver) || (Handle->Type == ctTCPclient)) {
|
||||
hints.ai_family = AF_UNSPEC; // use AF_INET6 to force IPv6
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
Hints->ai_family = AF_UNSPEC; // use AF_INET6 to force IPv6
|
||||
Hints->ai_socktype = SOCK_STREAM;
|
||||
} else {
|
||||
hints.ai_family = AF_UNSPEC; // use AF_INET6 to force IPv6
|
||||
hints.ai_socktype = SOCK_DGRAM;
|
||||
Hints->ai_family = AF_UNSPEC; // use AF_INET6 to force IPv6
|
||||
Hints->ai_socktype = SOCK_DGRAM;
|
||||
}
|
||||
|
||||
// Create request data
|
||||
ResolveReq = new TResolveReq;
|
||||
Handle->ResolveReq = ResolveReq;
|
||||
|
||||
ResolveReq->Handle = Handle;
|
||||
ResolveReq->Request = (gaicb*)calloc( 1, sizeof(gaicb) );
|
||||
|
||||
// DNS request / reply structure
|
||||
ResolveReq->Request->ar_name = Handle->HostName;
|
||||
ResolveReq->Request->ar_service = Handle->PortName;
|
||||
ResolveReq->Request->ar_request = Hints;
|
||||
ResolveReq->Request->ar_result = NULL;
|
||||
|
||||
// Configure signal event
|
||||
ResolveEvt.sigev_notify = SIGEV_SIGNAL;
|
||||
ResolveEvt.sigev_signo = SIGRTMIN;
|
||||
ResolveEvt.sigev_value.sival_ptr = ResolveReq;
|
||||
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Resolving Host name [%s:%s]...",
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName );
|
||||
|
||||
// Should address be resolved later during process()
|
||||
if (DelayResolve)
|
||||
{
|
||||
if (DelayResolve) {
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Delay resolving of Host Name [%s:%s]",
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName );
|
||||
ChangeState( Handle, csOpenRequest );
|
||||
|
||||
HandleState( Handle, csOpenRequest );
|
||||
return false;
|
||||
}
|
||||
|
||||
// Resolve Host & Port Names
|
||||
if ((result = getaddrinfo( Handle->HostName, Handle->PortName, &hints, &(Handle->AddressList))) != 0)
|
||||
{
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Failed to resolve Host Name [%s:%s] (%s)",
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName, gai_strerror(result) );
|
||||
ChangeState( Handle, csFailed );
|
||||
Handle->Resolving = true;
|
||||
if ((Result = getaddrinfo_a( GAI_NOWAIT, &(Handle->ResolveReq->Request), 1, &ResolveEvt )) != 0) {
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Error resolving Host Name [%s:%s] (%s)",
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName, gai_strerror(Result) );
|
||||
DestroyResolveReq( Handle, true );
|
||||
|
||||
HandleState( Handle, csFailed );
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CSelectableCore::DestroyResolveReq( THandle * Handle, bool DestroyResult )
|
||||
{
|
||||
// Validate
|
||||
if (!Handle || !Handle->ResolveReq)
|
||||
return false;
|
||||
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Destroying resolve request [%s:%s]",
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName );
|
||||
|
||||
// Destroy
|
||||
if (DestroyResult) {
|
||||
if (Handle->ResolveReq->Request->ar_result)
|
||||
freeaddrinfo( Handle->ResolveReq->Request->ar_result );
|
||||
}
|
||||
if (Handle->ResolveReq->Request->ar_request)
|
||||
free( (void*)Handle->ResolveReq->Request->ar_request );
|
||||
if (Handle->ResolveReq->Request)
|
||||
free( Handle->ResolveReq->Request );
|
||||
if (Handle->ResolveReq)
|
||||
delete Handle->ResolveReq;
|
||||
|
||||
// Reset request
|
||||
Handle->ResolveReq = NULL;
|
||||
Handle->Resolving = false;
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CSelectableCore::HandleResolve( THandle * Handle )
|
||||
{
|
||||
bool Result;
|
||||
|
||||
// Validate result
|
||||
if ((Result = gai_error( Handle->ResolveReq->Request )) != 0) {
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Error resolving Host Name [%s:%s] (%s)",
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName, gai_strerror(Result) );
|
||||
DestroyResolveReq( Handle, true );
|
||||
|
||||
HandleState( Handle, csFailed );
|
||||
return false;
|
||||
}
|
||||
|
||||
// Select first address, skip "0.0.0.0"
|
||||
// Read result
|
||||
Handle->AddressList = Handle->ResolveReq->Request->ar_result;
|
||||
Handle->AddressInfo = Handle->AddressList;
|
||||
|
||||
// Select first address, skip "0.0.0.0"
|
||||
if (!strcmp( inet_ntoa(((struct sockaddr_in *)Handle->AddressInfo->ai_addr)->sin_addr), "0.0.0.0" ))
|
||||
Handle->AddressInfo = Handle->AddressInfo->ai_next;
|
||||
|
||||
if (!Handle->AddressInfo) {
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Failed to resolve Host Name [%s:%s] (%s)",
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName, gai_strerror(result) );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Failed to resolve Host Name [%s:%s] (No Result)",
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName );
|
||||
freeaddrinfo( Handle->AddressList );
|
||||
Handle->AddressList = NULL;
|
||||
Handle->AddressInfo = NULL;
|
||||
ChangeState( Handle, csFailed );
|
||||
|
||||
HandleState( Handle, csFailed );
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -941,6 +1146,9 @@ bool CSelectableCore::ResolveAddress( THandle * Handle, bool DelayResolve )
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName,
|
||||
inet_ntoa(((struct sockaddr_in *)Handle->AddressInfo->ai_addr)->sin_addr),
|
||||
ntohs(((struct sockaddr_in *)Handle->AddressInfo->ai_addr)->sin_port) );
|
||||
|
||||
// Destroy request
|
||||
DestroyResolveReq( Handle, false );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -964,7 +1172,7 @@ THandle * CSelectableCore::OpenUDPserverSocket( THandle * Handle, bool DelayReso
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName, strerror(errno) );
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
};
|
||||
|
||||
@@ -985,7 +1193,7 @@ THandle * CSelectableCore::OpenUDPserverSocket( THandle * Handle, bool DelayReso
|
||||
Handle->AddressFailed = true;
|
||||
|
||||
// Change state
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
};
|
||||
|
||||
@@ -999,7 +1207,7 @@ THandle * CSelectableCore::OpenUDPserverSocket( THandle * Handle, bool DelayReso
|
||||
}
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csOpen );
|
||||
HandleState( Handle, csOpen );
|
||||
return Handle;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -1081,7 +1289,7 @@ THandle * CSelectableCore::OpenUDPclientSocket( THandle * Handle, bool DelayReso
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName, strerror(errno) );
|
||||
|
||||
// Set Status
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
};
|
||||
|
||||
@@ -1098,7 +1306,7 @@ THandle * CSelectableCore::OpenUDPclientSocket( THandle * Handle, bool DelayReso
|
||||
}
|
||||
|
||||
// Set status
|
||||
ChangeState( Handle, csOpen );
|
||||
HandleState( Handle, csOpen );
|
||||
return Handle;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -1133,7 +1341,7 @@ THandle * CSelectableCore::OpenTCPserverSocket( THandle * Handle, bool DelayReso
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName, strerror(errno) );
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
};
|
||||
|
||||
@@ -1146,7 +1354,7 @@ THandle * CSelectableCore::OpenTCPserverSocket( THandle * Handle, bool DelayReso
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName, strerror(errno) );
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1161,7 +1369,7 @@ THandle * CSelectableCore::OpenTCPserverSocket( THandle * Handle, bool DelayReso
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName, strerror(errno) );
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1181,7 +1389,7 @@ THandle * CSelectableCore::OpenTCPserverSocket( THandle * Handle, bool DelayReso
|
||||
Handle->FD = -1;
|
||||
Handle->AddressFailed = true;
|
||||
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
};
|
||||
|
||||
@@ -1197,7 +1405,7 @@ THandle * CSelectableCore::OpenTCPserverSocket( THandle * Handle, bool DelayReso
|
||||
Handle->FD = -1;
|
||||
Handle->AddressFailed = true;
|
||||
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
};
|
||||
|
||||
@@ -1211,7 +1419,7 @@ THandle * CSelectableCore::OpenTCPserverSocket( THandle * Handle, bool DelayReso
|
||||
}
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csOpen );
|
||||
HandleState( Handle, csOpen );
|
||||
return Handle;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -1313,7 +1521,7 @@ THandle * CSelectableCore::OpenTCPremoteSocket( THandle * Handle )
|
||||
ProcessName, Name, Handle->Name, Handle->HostName );
|
||||
|
||||
// Update state
|
||||
ChangeState( Handle, csOpen );
|
||||
HandleState( Handle, csOpen );
|
||||
return Handle;
|
||||
}
|
||||
}
|
||||
@@ -1324,10 +1532,11 @@ THandle * CSelectableCore::OpenTCPremoteSocket( THandle * Handle )
|
||||
THandle * CSelectableCore::OpenTCPclientSocket( THandle * Handle, bool DelayResolve )
|
||||
{
|
||||
// Socket options
|
||||
int KeepAlive_opt = 1;
|
||||
int TCPidle_opt = 5;
|
||||
int TCPcnt_opt = 3;
|
||||
int TCPint_opt = 2;
|
||||
int KeepAlive_opt = 1; // Enable/disable keep alive
|
||||
int TCPidle_opt = 5; // Idle time on socket before sending first keep alive signal
|
||||
int TCPint_opt = 2; // Interval between keep alive signals
|
||||
int TCPcnt_opt = 3; // No of missed keep alive response before connection fail
|
||||
int TCPsyn_opt = 3; // Max SYN (connect retries) before open fails
|
||||
|
||||
// Check state
|
||||
if (Handle->State == csOpen) {
|
||||
@@ -1349,7 +1558,7 @@ THandle * CSelectableCore::OpenTCPclientSocket( THandle * Handle, bool DelayReso
|
||||
ProcessName, Name, Handle->Name, Handle->HostName, Handle->PortName, strerror(errno) );
|
||||
|
||||
// Set Status
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
};
|
||||
|
||||
@@ -1361,7 +1570,8 @@ THandle * CSelectableCore::OpenTCPclientSocket( THandle * Handle, bool DelayReso
|
||||
if ((setsockopt( Handle->FD, SOL_SOCKET, SO_KEEPALIVE, &KeepAlive_opt, sizeof(KeepAlive_opt)) == -1) ||
|
||||
(setsockopt( Handle->FD, SOL_TCP, TCP_KEEPIDLE, &TCPidle_opt, sizeof(TCPidle_opt)) == -1) ||
|
||||
(setsockopt( Handle->FD, SOL_TCP, TCP_KEEPCNT, &TCPcnt_opt, sizeof(TCPcnt_opt)) == -1) ||
|
||||
(setsockopt( Handle->FD, SOL_TCP, TCP_KEEPINTVL, &TCPint_opt, sizeof(TCPint_opt)) == -1) )
|
||||
(setsockopt( Handle->FD, SOL_TCP, TCP_KEEPINTVL, &TCPint_opt, sizeof(TCPint_opt)) == -1) ||
|
||||
(setsockopt( Handle->FD, SOL_TCP, TCP_SYNCNT, &TCPsyn_opt, sizeof(TCPsyn_opt)) == -1) )
|
||||
{
|
||||
// Log Event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Could not set KeepAlive options [%s:%s] (%s)",
|
||||
@@ -1371,7 +1581,7 @@ THandle * CSelectableCore::OpenTCPclientSocket( THandle * Handle, bool DelayReso
|
||||
close( Handle->FD );
|
||||
Handle->FD = -1;
|
||||
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -1388,7 +1598,7 @@ THandle * CSelectableCore::OpenTCPclientSocket( THandle * Handle, bool DelayReso
|
||||
}
|
||||
|
||||
// Set status
|
||||
ChangeState( Handle, csOpen );
|
||||
HandleState( Handle, csOpen );
|
||||
return Handle;
|
||||
}
|
||||
else if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EALREADY))
|
||||
@@ -1403,7 +1613,7 @@ THandle * CSelectableCore::OpenTCPclientSocket( THandle * Handle, bool DelayReso
|
||||
}
|
||||
|
||||
// Set status
|
||||
ChangeState( Handle, csWaitingtoOpen );
|
||||
HandleState( Handle, csWaitingtoOpen );
|
||||
return Handle;
|
||||
}
|
||||
else
|
||||
@@ -1422,7 +1632,7 @@ THandle * CSelectableCore::OpenTCPclientSocket( THandle * Handle, bool DelayReso
|
||||
Handle->FD = -1;
|
||||
Handle->AddressFailed = true;
|
||||
|
||||
ChangeState( Handle, csFailed );
|
||||
HandleState( Handle, csFailed );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -1614,7 +1824,7 @@ bool CSelectableCore::Close( THandle * Handle, bool QuickReopen )
|
||||
};
|
||||
|
||||
// Change State
|
||||
ChangeState( Handle, ((Fail)? csFailed : csClosed) );
|
||||
HandleState( Handle, ((Fail)? csFailed : csClosed) );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user