ZNC trunk
Loading...
Searching...
No Matches
Csock Class Reference

Basic socket class. More...

#include <Csocket.h>

Inheritance diagram for Csock:
Collaboration diagram for Csock:

Public Types

enum  ETConn { OUTBOUND = 0 , LISTENER = 1 , INBOUND = 2 }
enum  EFRead {
  READ_EOF = 0 , READ_ERR = -1 , READ_EAGAIN = -2 , READ_CONNREFUSED = -3 ,
  READ_TIMEDOUT = -4
}
enum  EFSelect { SEL_OK = 0 , SEL_TIMEOUT = -1 , SEL_EAGAIN = -2 , SEL_ERR = -3 }
enum  ESSLMethod {
  TLS = 0 , SSL23 = TLS , SSL2 = 2 , SSL3 = 3 ,
  TLS1 = 4 , TLS11 = 5 , TLS12 = 6
}
enum  EDisableProtocol {
  EDP_None = 0 , EDP_SSLv2 = 1 , EDP_SSLv3 = 2 , EDP_TLSv1 = 4 ,
  EDP_TLSv1_1 = 8 , EDP_TLSv1_2 = 16 , EDP_SSL = (EDP_SSLv2|EDP_SSLv3)
}
enum  ECONState {
  CST_START = 0 , CST_DNS = CST_START , CST_BINDVHOST = 1 , CST_DESTDNS = 2 ,
  CST_CONNECT = 3 , CST_CONNECTSSL = 4 , CST_OK = 5
}
enum  ECloseType { CLT_DONT = 0 , CLT_NOW = 1 , CLT_AFTERWRITE = 2 , CLT_DEREFERENCE = 3 }
enum  { TMO_READ = 1 , TMO_WRITE = 2 , TMO_ACCEPT = 4 , TMO_ALL = TMO_READ|TMO_WRITE|TMO_ACCEPT }
 this timeout isn't just connection timeout, but also timeout on NOT recieving data, to disable this set it to 0 then the normal TCP timeout will apply (basically TCP will kill a dead connection) Set the timeout, set to 0 to never timeout More...
enum  EDNSLType { DNS_VHOST , DNS_DEST }

Public Member Functions

 Csock (int iTimeout=60)
 default constructor, sets a timeout of 60 seconds
 Csock (const CS_STRING &sHostname, uint16_t uPort, int itimeout=60)
 Advanced constructor, for creating a simple connection.
virtual CsockGetSockObj (const CS_STRING &sHostname, uint16_t iPort)
 override this for accept sockets
virtual ~Csock ()
virtual void Dereference ()
 in the event you pass this class to Copy(), you MUST call this function or on the original Csock other wise bad side effects will happen (double deletes, weird sock closures, etc) if you call this function and have not handled the internal pointers, other bad things can happend (memory leaks, fd leaks, etc) the whole point of this function is to allow this class to go away without shutting down
virtual void Copy (const Csock &cCopy)
 use this to copy a sock from one to the other, override it if you have special needs in the event of a copy
Csockoperator<< (const CS_STRING &s)
Csockoperator<< (std::ostream &(*io)(std::ostream &))
Csockoperator<< (int32_t i)
Csockoperator<< (uint32_t i)
Csockoperator<< (int64_t i)
Csockoperator<< (uint64_t i)
Csockoperator<< (float i)
Csockoperator<< (double i)
virtual bool Connect ()
 Create the connection, this is used by the socket manager, and shouldn't be called directly by the user.
virtual bool ConnectUnix (const CS_STRING &sPath)
 Connect to a UNIX socket.
virtual bool ListenUnix (const CS_STRING &sBindFile, int iMaxConns=SOMAXCONN, uint32_t iTimeout=0)
 Listens for connections on an UNIX socket.
virtual bool Listen (uint16_t iPort, int iMaxConns=SOMAXCONN, const CS_STRING &sBindHost="", uint32_t iTimeout=0, bool bDetach=false)
 Listens for connections.
virtual cs_sock_t Accept (CS_STRING &sHost, uint16_t &iRPort)
 Accept an inbound connection, this is used internally.
virtual bool AcceptSSL ()
 Accept an inbound SSL connection, this is used internally and called after Accept.
virtual bool SSLClientSetup ()
 This sets up the SSL Client, this is used internally.
virtual bool SSLServerSetup ()
 This sets up the SSL Server, this is used internally.
virtual bool ConnectSSL ()
 Create the SSL connection.
bool StartTLS ()
 start a TLS connection on an existing plain connection
virtual bool Write (const char *data, size_t len)
 Write data to the socket.
virtual bool Write (const CS_STRING &sData)
 Write a text string to the socket.
virtual cs_ssize_t Read (char *data, size_t len)
 Read from the socket Just pass in a pointer, big enough to hold len bytes.
CS_STRING GetLocalIP () const
CS_STRING GetRemoteIP () const
virtual bool IsConnected () const
 Tells you if the socket is connected.
virtual void SetIsConnected (bool b)
 Sets the sock, telling it its connected (internal use only)
cs_sock_tGetRSock ()
 returns a reference to the sock
const cs_sock_tGetRSock () const
void SetRSock (cs_sock_t iSock)
cs_sock_tGetWSock ()
const cs_sock_tGetWSock () const
void SetWSock (cs_sock_t iSock)
void SetSock (cs_sock_t iSock)
cs_sock_tGetSock ()
const cs_sock_tGetSock () const
void CallSockError (int iErrno, const CS_STRING &sDescription="")
 calls SockError, if sDescription is not set, then strerror is used to pull out a default description
virtual void ResetTimer ()
 resets the time counter, this is virtual in the event you need an event on the timer being Reset
void PauseRead ()
 will pause/unpause reading on this socket
void UnPauseRead ()
bool IsReadPaused () const
void SetTimeout (int iTimeout, uint32_t iTimeoutType=TMO_ALL)
 Currently this uses the same value for all timeouts, and iTimeoutType merely states which event will be checked for timeouts.
void SetTimeoutType (uint32_t iTimeoutType)
int GetTimeout () const
uint32_t GetTimeoutType () const
virtual bool CheckTimeout (time_t iNow)
 returns true if the socket has timed out
virtual void PushBuff (const char *data, size_t len, bool bStartAtZero=false)
 pushes data up on the buffer, if a line is ready it calls the ReadLine event
CS_STRINGGetInternalReadBuffer ()
 This gives access to the internal read buffer, if your not going to use ReadLine(), then you may want to clear this out (if its binary data and not many '\n')
CS_STRINGGetInternalWriteBuffer ()
 This gives access to the internal write buffer.
void SetMaxBufferThreshold (uint32_t iThreshold)
 sets the max buffered threshold when EnableReadLine() is enabled
uint32_t GetMaxBufferThreshold () const
int GetType () const
 Returns the connection type from enum eConnType.
void SetType (int iType)
const CS_STRINGGetSockName () const
 Returns a reference to the socket name.
void SetSockName (const CS_STRING &sName)
const CS_STRINGGetHostName () const
 Returns a reference to the host name.
void SetHostName (const CS_STRING &sHostname)
uint64_t GetStartTime () const
 Gets the starting time of this socket.
void ResetStartTime ()
 Resets the start time.
uint64_t GetBytesRead () const
 Gets the amount of data read during the existence of the socket.
void ResetBytesRead ()
uint64_t GetBytesWritten () const
 Gets the amount of data written during the existence of the socket.
void ResetBytesWritten ()
double GetAvgRead (uint64_t iSample=1000) const
 Get Avg Read Speed in sample milliseconds (default is 1000 milliseconds or 1 second)
double GetAvgWrite (uint64_t iSample=1000) const
 Get Avg Write Speed in sample milliseconds (default is 1000 milliseconds or 1 second)
uint16_t GetRemotePort () const
 Returns the remote port.
uint16_t GetLocalPort () const
 Returns the local port.
uint16_t GetPort () const
 Returns the port.
void SetPort (uint16_t iPort)
void Close (ECloseType eCloseType=CLT_NOW)
 just mark us as closed, the parent can pick it up
ECloseType GetCloseType () const
 returns int of type to close
bool IsClosed () const
void NonBlockingIO ()
 Use this to change your fd's to blocking or none blocking.
bool GetSSL () const
 Return true if this socket is using ssl. Note this does not mean the SSL state is finished, but simply that its configured to use ssl.
void SetSSL (bool b)
void DisableSSLProtocols (u_int uDisableOpts)
 bitwise setter,
void DisableSSLCompression ()
 allow disabling compression
void FollowSSLCipherServerPreference ()
 select the ciphers in server-preferred order
void SetCipher (const CS_STRING &sCipher)
 Set the cipher type ( openssl cipher [to see ciphers available] )
const CS_STRINGGetCipher () const
void SetDHParamLocation (const CS_STRING &sDHParamFile)
 Set the pem file location.
const CS_STRINGGetDHParamLocation () const
void SetKeyLocation (const CS_STRING &sKeyFile)
const CS_STRINGGetKeyLocation () const
void SetPemLocation (const CS_STRING &sPemFile)
const CS_STRINGGetPemLocation () const
void SetPemPass (const CS_STRING &sPassword)
const CS_STRINGGetPemPass () const
void SetSSLMethod (int iMethod)
 Set the SSL method type.
int GetSSLMethod () const
void SetSSLObject (SSL *ssl, bool bDeleteExisting=false)
SSL * GetSSLObject () const
void SetCTXObject (SSL_CTX *sslCtx, bool bDeleteExisting=false)
SSL_SESSION * GetSSLSession () const
void SetCertVerifyCB (FPCertVerifyCB pFP)
 setting this to NULL will allow the default openssl verification process kick in
bool HasWriteBuffer () const
 Get the send buffer.
void ClearWriteBuffer ()
bool SslIsEstablished () const
 is SSL_accept finished ?
bool ConnectInetd (bool bIsSSL=false, const CS_STRING &sHostname="")
 Use this to bind this socket to inetd.
bool ConnectFD (int iReadFD, int iWriteFD, const CS_STRING &sName, bool bIsSSL=false, ETConn eDirection=INBOUND)
 Tie this guy to an existing real file descriptor.
X509 * GetX509 () const
 Get the peer's X509 cert.
CS_STRING GetPeerPubKey () const
 Returns the peer's public key.
long GetPeerFingerprint (CS_STRING &sFP) const
 Returns the peer's certificate finger print.
uint32_t GetRequireClientCertFlags () const
void SetRequiresClientCert (bool bRequiresCert)
 legacy, deprecated
void SetRequireClientCertFlags (uint32_t iRequireClientCertFlags)
 bitwise flags, 0 means don't require cert, SSL_VERIFY_PEER verifies peers, SSL_VERIFY_FAIL_IF_NO_PEER_CERT will cause the connection to fail if no cert
virtual void SetParentSockName (const CS_STRING &sParentName)
 Set The INBOUND Parent sockname.
const CS_STRINGGetParentSockName () const
virtual void SetRate (uint32_t iBytes, uint64_t iMilliseconds)
 sets the rate at which we can send data
uint32_t GetRateBytes () const
uint64_t GetRateTime () const
virtual void Connected ()
 Connected event.
virtual void Disconnected ()
 Disconnected event.
virtual void Timeout ()
 Sock Timed out event.
virtual void ReadData (const char *data, size_t len)
 Ready to read data event.
virtual void ReadLine (const CS_STRING &sLine)
 Ready to Read a full line event.
void EnableReadLine ()
 set the value of m_bEnableReadLine to true, we don't want to store a buffer for ReadLine, unless we want it
void DisableReadLine ()
bool HasReadLine () const
 returns the value of m_bEnableReadLine, if ReadLine is enabled
virtual void ReachedMaxBuffer ()
 This WARNING event is called when your buffer for readline exceeds the warning threshold and triggers this event.
virtual void SockError (int iErrno, const CS_STRING &sDescription)
 A sock error occured event.
virtual bool ConnectionFrom (const CS_STRING &sHost, uint16_t iPort)
 Incoming Connection Event return false and the connection will fail default returns true.
virtual void Listening (const CS_STRING &sBindIP, uint16_t uPort)
 called when type is LISTENER and the listening port is up and running
virtual void ConnectionRefused ()
 Connection Refused Event.
virtual void ReadPaused ()
 This gets called every iteration of CSocketManager::Select() if the socket is ReadPaused.
virtual void SSLFinishSetup (SSL *pSSL)
 Gets called immediatly after the m_ssl member is setup and initialized, useful if you need to assign anything to this ssl session via SSL_set_ex_data.
virtual bool SNIConfigureServer (const CS_STRING &sHostname, CS_STRING &sPemFile, CS_STRING &sPemPass)
 gets called when a SNI request is sent, and used to configure a SNI session
virtual bool SNIConfigureClient (CS_STRING &sHostname)
 called to configure the SNI client
SSL_CTX * SetupServerCTX ()
 creates a new SSL_CTX based on the setup of this sock
virtual void SSLHandShakeFinished ()
 called once the SSL handshake is complete, this is triggered via SSL_CB_HANDSHAKE_DONE in SSL_set_info_callback()
virtual int VerifyPeerCertificate (int iPreVerify, X509_STORE_CTX *pStoreCTX)
 this is hooked in via SSL_set_verify, and be default it just returns 1 meaning success
time_t GetTimeSinceLastDataTransaction (time_t iNow=0) const
 return how long it has been (in seconds) since the last read or successful write
time_t GetLastCheckTimeout () const
time_t GetNextCheckTimeout (time_t iNow=0) const
 Returns the time when CheckTimeout() should be called next.
virtual int GetPending () const
 return the data imediatly ready for read
ECONState GetConState () const
 returns the current connection state
void SetConState (ECONState eState)
 sets the connection state to eState
bool CreateSocksFD ()
 grabs fd's for the sockets
void CloseSocksFD ()
 puts the socks back to the state they were prior to calling CreateSocksFD
const CS_STRINGGetBindHost () const
void SetBindHost (const CS_STRING &sBindHost)
int DNSLookup (EDNSLType eDNSLType)
 dns lookup
bool SetupVHost ()
 this is only used on outbound connections, listeners bind in a different spot
bool GetIPv6 () const
void SetIPv6 (bool b)
void SetAFRequire (CSSockAddr::EAFRequire iAFRequire)
bool AllowWrite (uint64_t &iNOW) const
 returns true if this socket can write its data, primarily used with rate shaping, initialize iNOW to 0 and it sets it on the first call
void SetSkipConnect (bool b)
virtual int GetAddrInfo (const CS_STRING &sHostname, CSSockAddr &csSockAddr)
 override this call with your own DNS lookup method if you have one.
virtual int ConvertAddress (const struct sockaddr_storage *pAddr, socklen_t iAddrLen, CS_STRING &sIP, uint16_t *piPort) const
 retrieve name info (numeric only) for a given sockaddr_storage
int GetMaxConns () const
 returns the number of max pending connections when type is LISTENER
void SetEncoding (const CS_STRING &sEncoding)
CS_STRING GetEncoding () const
virtual void IcuExtToUCallback (UConverterToUnicodeArgs *toArgs, const char *codeUnits, int32_t length, UConverterCallbackReason reason, UErrorCode *err)
virtual void IcuExtFromUCallback (UConverterFromUnicodeArgs *fromArgs, const UChar *codeUnits, int32_t length, UChar32 codePoint, UConverterCallbackReason reason, UErrorCode *err)
void CleanupCrons ()
void CleanupFDMonitors ()
const std::vector< CCron * > & GetCrons () const
 returns a const reference to the crons associated to this socket
virtual void Cron ()
 This has a garbage collecter, and is used internall to call the jobs.
virtual void AddCron (CCron *pcCron)
 insert a newly created cron
virtual void DelCron (const CS_STRING &sName, bool bDeleteAll=true, bool bCaseSensitive=true)
 deletes a cron by name
virtual void DelCron (uint32_t iPos)
 delete cron by idx
virtual void DelCronByAddr (CCron *pcCron)
 delete cron by address
void CheckFDs (const std::map< cs_sock_t, short > &miiReadyFds)
void AssignFDs (std::map< cs_sock_t, short > &miiReadyFds, struct timeval *tvtimeout)
void MonitorFD (CSMonitorFD *pMonitorFD)
 add an FD set to monitor

Protected Attributes

std::vector< CCron * > m_vcCrons
std::vector< CSMonitorFD * > m_vcMonitorFD

Detailed Description

Basic socket class.

The most basic level socket class. You can use this class directly for quick things or use the socket manager.

See also
TSocketManager
Author
Jim Hull csock.nosp@m.et@j.nosp@m.imloc.nosp@m.o.co.nosp@m.m

Member Enumeration Documentation

◆ anonymous enum

anonymous enum

this timeout isn't just connection timeout, but also timeout on NOT recieving data, to disable this set it to 0 then the normal TCP timeout will apply (basically TCP will kill a dead connection) Set the timeout, set to 0 to never timeout

Enumerator
TMO_READ 
TMO_WRITE 
TMO_ACCEPT 
TMO_ALL 

◆ ECloseType

Enumerator
CLT_DONT 

don't close DER

CLT_NOW 

close immediatly

CLT_AFTERWRITE 

close after finishing writing the buffer

CLT_DEREFERENCE 

used after copy in Csock::Dereference() to cleanup a sock thats being shutdown

◆ ECONState

Enumerator
CST_START 
CST_DNS 
CST_BINDVHOST 
CST_DESTDNS 
CST_CONNECT 
CST_CONNECTSSL 
CST_OK 

◆ EDisableProtocol

Enumerator
EDP_None 

disable nothing

EDP_SSLv2 

disable SSL version 2

EDP_SSLv3 

disable SSL version 3

EDP_TLSv1 

disable TLS version 1

EDP_TLSv1_1 

disable TLS version 1.1

EDP_TLSv1_2 

disable TLS version 1.2

EDP_SSL 

◆ EDNSLType

Enumerator
DNS_VHOST 

this lookup is for the vhost bind

DNS_DEST 

this lookup is for the destination address

◆ EFRead

Enumerator
READ_EOF 

End Of File, done reading.

READ_ERR 

Error on the socket, socket closed, done reading.

READ_EAGAIN 

Try to get data again.

READ_CONNREFUSED 

Connection Refused.

READ_TIMEDOUT 

Connection timed out.

◆ EFSelect

Enumerator
SEL_OK 

Select passed ok.

SEL_TIMEOUT 

Select timed out.

SEL_EAGAIN 

Select wants you to try again.

SEL_ERR 

Select recieved an error.

◆ ESSLMethod

Enumerator
TLS 
SSL23 
SSL2 
SSL3 
TLS1 
TLS11 
TLS12 

◆ ETConn

Enumerator
OUTBOUND 

outbound connection

LISTENER 

a socket accepting connections

INBOUND 

an inbound connection, passed from LISTENER

Constructor & Destructor Documentation

◆ Csock() [1/2]

Csock::Csock ( int iTimeout = 60)

◆ Csock() [2/2]

Csock::Csock ( const CS_STRING & sHostname,
uint16_t uPort,
int itimeout = 60 )

Advanced constructor, for creating a simple connection.

Parameters
sHostnamethe hostname your are connecting to
uPortthe port you are connecting to
itimeouthow long to wait before ditching the connection, default is 60 seconds

References CS_STRING.

◆ ~Csock()

virtual Csock::~Csock ( )
virtual

Member Function Documentation

◆ Accept()

virtual cs_sock_t Csock::Accept ( CS_STRING & sHost,
uint16_t & iRPort )
virtual

Accept an inbound connection, this is used internally.

References CS_STRING.

◆ AcceptSSL()

virtual bool Csock::AcceptSSL ( )
virtual

Accept an inbound SSL connection, this is used internally and called after Accept.

◆ AddCron()

virtual void CSockCommon::AddCron ( CCron * pcCron)
virtualinherited

insert a newly created cron

◆ AllowWrite()

bool Csock::AllowWrite ( uint64_t & iNOW) const

returns true if this socket can write its data, primarily used with rate shaping, initialize iNOW to 0 and it sets it on the first call

◆ AssignFDs()

void CSockCommon::AssignFDs ( std::map< cs_sock_t, short > & miiReadyFds,
struct timeval * tvtimeout )
inherited

◆ CallSockError()

void Csock::CallSockError ( int iErrno,
const CS_STRING & sDescription = "" )

calls SockError, if sDescription is not set, then strerror is used to pull out a default description

Parameters
iErrnothe errno to send
sDescriptionthe description of the error that occurred

References CS_STRING.

◆ CheckFDs()

void CSockCommon::CheckFDs ( const std::map< cs_sock_t, short > & miiReadyFds)
inherited

◆ CheckTimeout()

virtual bool Csock::CheckTimeout ( time_t iNow)
virtual

returns true if the socket has timed out

◆ CleanupCrons()

void CSockCommon::CleanupCrons ( )
inherited

◆ CleanupFDMonitors()

void CSockCommon::CleanupFDMonitors ( )
inherited

◆ ClearWriteBuffer()

void Csock::ClearWriteBuffer ( )

◆ Close()

void Csock::Close ( ECloseType eCloseType = CLT_NOW)

just mark us as closed, the parent can pick it up

References CLT_NOW.

Referenced by CExecSock::Kill().

◆ CloseSocksFD()

void Csock::CloseSocksFD ( )

puts the socks back to the state they were prior to calling CreateSocksFD

◆ Connect()

virtual bool Csock::Connect ( )
virtual

Create the connection, this is used by the socket manager, and shouldn't be called directly by the user.

Returns
true on success

Reimplemented in CSocket.

Referenced by CSocket::operator=().

◆ Connected()

virtual void Csock::Connected ( )
inlinevirtual

Connected event.

Reimplemented in CClient, CHTTPSock, and CIRCSock.

◆ ConnectFD()

bool Csock::ConnectFD ( int iReadFD,
int iWriteFD,
const CS_STRING & sName,
bool bIsSSL = false,
ETConn eDirection = INBOUND )

Tie this guy to an existing real file descriptor.

References CS_STRING, and INBOUND.

Referenced by CExecSock::Execute().

◆ ConnectInetd()

bool Csock::ConnectInetd ( bool bIsSSL = false,
const CS_STRING & sHostname = "" )

Use this to bind this socket to inetd.

References CS_STRING.

◆ ConnectionFrom()

virtual bool Csock::ConnectionFrom ( const CS_STRING & sHost,
uint16_t iPort )
inlinevirtual

Incoming Connection Event return false and the connection will fail default returns true.

References CS_STRING.

◆ ConnectionRefused()

virtual void Csock::ConnectionRefused ( )
inlinevirtual

Connection Refused Event.

Reimplemented in CClient, and CIRCSock.

◆ ConnectSSL()

virtual bool Csock::ConnectSSL ( )
virtual

Create the SSL connection.

Returns
true on success

This is used by the socket manager, and shouldn't be called directly by the user.

◆ ConnectUnix()

virtual bool Csock::ConnectUnix ( const CS_STRING & sPath)
virtual

Connect to a UNIX socket.

Parameters
sPaththe path to the UNIX socket.

References CS_STRING.

◆ ConvertAddress()

virtual int Csock::ConvertAddress ( const struct sockaddr_storage * pAddr,
socklen_t iAddrLen,
CS_STRING & sIP,
uint16_t * piPort ) const
virtual

retrieve name info (numeric only) for a given sockaddr_storage

Parameters
pAddrthe sockaddr_storage
iAddrLenthe length
sIPfilled with the IP from getnameinfo
piPortif not null, filled with the port
Returns
0 on success.

In the event you want to do additional work before or after getnameinfo is called, you can override this and do just that. One example is in the event that an ipv6 ip is a mapped ipv4 mapped, you can check like so.

  • if( pAddr->ss_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED( &(((const struct sockaddr_in6 *)pAddr)->sin6_addr ) )

References CS_STRING.

◆ Copy()

virtual void Csock::Copy ( const Csock & cCopy)
virtual

use this to copy a sock from one to the other, override it if you have special needs in the event of a copy

References Csock().

◆ CreateSocksFD()

bool Csock::CreateSocksFD ( )

grabs fd's for the sockets

◆ Cron()

virtual void CSockCommon::Cron ( )
virtualinherited

This has a garbage collecter, and is used internall to call the jobs.

◆ DelCron() [1/2]

virtual void CSockCommon::DelCron ( const CS_STRING & sName,
bool bDeleteAll = true,
bool bCaseSensitive = true )
virtualinherited

deletes a cron by name

Parameters
sNamethe name of the cron
bDeleteAlldelete all crons that match sName
bCaseSensitiveuse strcmp or strcasecmp

References CS_STRING.

◆ DelCron() [2/2]

virtual void CSockCommon::DelCron ( uint32_t iPos)
virtualinherited

delete cron by idx

◆ DelCronByAddr()

virtual void CSockCommon::DelCronByAddr ( CCron * pcCron)
virtualinherited

delete cron by address

◆ Dereference()

virtual void Csock::Dereference ( )
virtual

in the event you pass this class to Copy(), you MUST call this function or on the original Csock other wise bad side effects will happen (double deletes, weird sock closures, etc) if you call this function and have not handled the internal pointers, other bad things can happend (memory leaks, fd leaks, etc) the whole point of this function is to allow this class to go away without shutting down

◆ DisableReadLine()

void Csock::DisableReadLine ( )

◆ DisableSSLCompression()

void Csock::DisableSSLCompression ( )
inline

allow disabling compression

◆ DisableSSLProtocols()

void Csock::DisableSSLProtocols ( u_int uDisableOpts)
inline

bitwise setter,

See also
EDisableProtocol

◆ Disconnected()

virtual void Csock::Disconnected ( )
inlinevirtual

Disconnected event.

Reimplemented in CClient, and CIRCSock.

◆ DNSLookup()

int Csock::DNSLookup ( EDNSLType eDNSLType)

dns lookup

See also
EDNSLType
Returns
0 for success, EAGAIN to check back again (same arguments as before), ETIMEDOUT on failure

◆ EnableReadLine()

void Csock::EnableReadLine ( )

set the value of m_bEnableReadLine to true, we don't want to store a buffer for ReadLine, unless we want it

◆ FollowSSLCipherServerPreference()

void Csock::FollowSSLCipherServerPreference ( )
inline

select the ciphers in server-preferred order

◆ GetAddrInfo()

virtual int Csock::GetAddrInfo ( const CS_STRING & sHostname,
CSSockAddr & csSockAddr )
virtual

override this call with your own DNS lookup method if you have one.

By default this function is blocking

Parameters
sHostnamethe hostname to resolve
csSockAddrthe destination sock address info
See also
CSSockAddr
Returns
0 on success, ETIMEDOUT if no lookup was found, EAGAIN if you should check again later for an answer

References CS_STRING.

◆ GetAvgRead()

double Csock::GetAvgRead ( uint64_t iSample = 1000) const

Get Avg Read Speed in sample milliseconds (default is 1000 milliseconds or 1 second)

◆ GetAvgWrite()

double Csock::GetAvgWrite ( uint64_t iSample = 1000) const

Get Avg Write Speed in sample milliseconds (default is 1000 milliseconds or 1 second)

◆ GetBindHost()

const CS_STRING & Csock::GetBindHost ( ) const
inline

References CS_STRING.

◆ GetBytesRead()

uint64_t Csock::GetBytesRead ( ) const

Gets the amount of data read during the existence of the socket.

◆ GetBytesWritten()

uint64_t Csock::GetBytesWritten ( ) const

Gets the amount of data written during the existence of the socket.

◆ GetCipher()

const CS_STRING & Csock::GetCipher ( ) const

References CS_STRING.

◆ GetCloseType()

ECloseType Csock::GetCloseType ( ) const
inline

returns int of type to close

See also
ECloseType

Referenced by IsClosed().

◆ GetConState()

ECONState Csock::GetConState ( ) const
inline

returns the current connection state

◆ GetCrons()

const std::vector< CCron * > & CSockCommon::GetCrons ( ) const
inlineinherited

returns a const reference to the crons associated to this socket

References m_vcCrons.

◆ GetDHParamLocation()

const CS_STRING & Csock::GetDHParamLocation ( ) const

References CS_STRING.

◆ GetEncoding()

CS_STRING Csock::GetEncoding ( ) const
inline

References CS_STRING.

◆ GetHostName()

const CS_STRING & Csock::GetHostName ( ) const

Returns a reference to the host name.

References CS_STRING.

◆ GetInternalReadBuffer()

CS_STRING & Csock::GetInternalReadBuffer ( )

This gives access to the internal read buffer, if your not going to use ReadLine(), then you may want to clear this out (if its binary data and not many '\n')

References CS_STRING.

◆ GetInternalWriteBuffer()

CS_STRING & Csock::GetInternalWriteBuffer ( )

This gives access to the internal write buffer.

If you want to check if the send queue fills up, check here.

References CS_STRING.

◆ GetIPv6()

bool Csock::GetIPv6 ( ) const
inline

◆ GetKeyLocation()

const CS_STRING & Csock::GetKeyLocation ( ) const

References CS_STRING.

◆ GetLastCheckTimeout()

time_t Csock::GetLastCheckTimeout ( ) const
inline

◆ GetLocalIP()

CS_STRING Csock::GetLocalIP ( ) const

References CS_STRING.

◆ GetLocalPort()

uint16_t Csock::GetLocalPort ( ) const

Returns the local port.

◆ GetMaxBufferThreshold()

uint32_t Csock::GetMaxBufferThreshold ( ) const

◆ GetMaxConns()

int Csock::GetMaxConns ( ) const
inline

returns the number of max pending connections when type is LISTENER

◆ GetNextCheckTimeout()

time_t Csock::GetNextCheckTimeout ( time_t iNow = 0) const

Returns the time when CheckTimeout() should be called next.

◆ GetParentSockName()

const CS_STRING & Csock::GetParentSockName ( ) const

References CS_STRING.

◆ GetPeerFingerprint()

long Csock::GetPeerFingerprint ( CS_STRING & sFP) const

Returns the peer's certificate finger print.

References CS_STRING.

◆ GetPeerPubKey()

CS_STRING Csock::GetPeerPubKey ( ) const

Returns the peer's public key.

References CS_STRING.

◆ GetPemLocation()

const CS_STRING & Csock::GetPemLocation ( ) const

References CS_STRING.

◆ GetPemPass()

const CS_STRING & Csock::GetPemPass ( ) const

References CS_STRING.

◆ GetPending()

virtual int Csock::GetPending ( ) const
virtual

return the data imediatly ready for read

◆ GetPort()

uint16_t Csock::GetPort ( ) const

Returns the port.

◆ GetRateBytes()

uint32_t Csock::GetRateBytes ( ) const

◆ GetRateTime()

uint64_t Csock::GetRateTime ( ) const

◆ GetRemoteIP()

CS_STRING Csock::GetRemoteIP ( ) const

References CS_STRING.

Referenced by CZNCSock::GetRemoteIP().

◆ GetRemotePort()

uint16_t Csock::GetRemotePort ( ) const

Returns the remote port.

◆ GetRequireClientCertFlags()

uint32_t Csock::GetRequireClientCertFlags ( ) const

◆ GetRSock() [1/2]

cs_sock_t & Csock::GetRSock ( )

returns a reference to the sock

Referenced by CExecSock::~CExecSock().

◆ GetRSock() [2/2]

const cs_sock_t & Csock::GetRSock ( ) const

◆ GetSock() [1/2]

cs_sock_t & Csock::GetSock ( )

◆ GetSock() [2/2]

const cs_sock_t & Csock::GetSock ( ) const

◆ GetSockName()

const CS_STRING & Csock::GetSockName ( ) const

Returns a reference to the socket name.

References CS_STRING.

◆ GetSockObj()

virtual Csock * Csock::GetSockObj ( const CS_STRING & sHostname,
uint16_t iPort )
virtual

override this for accept sockets

References Csock(), and CS_STRING.

◆ GetSSL()

bool Csock::GetSSL ( ) const

Return true if this socket is using ssl. Note this does not mean the SSL state is finished, but simply that its configured to use ssl.

◆ GetSSLMethod()

int Csock::GetSSLMethod ( ) const

◆ GetSSLObject()

SSL * Csock::GetSSLObject ( ) const

◆ GetSSLSession()

SSL_SESSION * Csock::GetSSLSession ( ) const

◆ GetStartTime()

uint64_t Csock::GetStartTime ( ) const

Gets the starting time of this socket.

◆ GetTimeout()

int Csock::GetTimeout ( ) const

◆ GetTimeoutType()

uint32_t Csock::GetTimeoutType ( ) const

◆ GetTimeSinceLastDataTransaction()

time_t Csock::GetTimeSinceLastDataTransaction ( time_t iNow = 0) const

return how long it has been (in seconds) since the last read or successful write

◆ GetType()

int Csock::GetType ( ) const

Returns the connection type from enum eConnType.

◆ GetWSock() [1/2]

cs_sock_t & Csock::GetWSock ( )

Referenced by CExecSock::~CExecSock().

◆ GetWSock() [2/2]

const cs_sock_t & Csock::GetWSock ( ) const

◆ GetX509()

X509 * Csock::GetX509 ( ) const

Get the peer's X509 cert.

it is up to you, the caller to call X509_free() on this object

◆ HasReadLine()

bool Csock::HasReadLine ( ) const
inline

returns the value of m_bEnableReadLine, if ReadLine is enabled

◆ HasWriteBuffer()

bool Csock::HasWriteBuffer ( ) const

Get the send buffer.

◆ IcuExtFromUCallback()

virtual void Csock::IcuExtFromUCallback ( UConverterFromUnicodeArgs * fromArgs,
const UChar * codeUnits,
int32_t length,
UChar32 codePoint,
UConverterCallbackReason reason,
UErrorCode * err )
virtual

Reimplemented in CIRCSocket.

References Csock(), and CSockCommon::CSockCommon().

◆ IcuExtToUCallback()

virtual void Csock::IcuExtToUCallback ( UConverterToUnicodeArgs * toArgs,
const char * codeUnits,
int32_t length,
UConverterCallbackReason reason,
UErrorCode * err )
virtual

Reimplemented in CIRCSocket.

◆ IsClosed()

bool Csock::IsClosed ( ) const
inline

References CLT_DONT, and GetCloseType().

◆ IsConnected()

virtual bool Csock::IsConnected ( ) const
virtual

Tells you if the socket is connected.

◆ IsReadPaused()

bool Csock::IsReadPaused ( ) const

◆ Listen()

virtual bool Csock::Listen ( uint16_t iPort,
int iMaxConns = SOMAXCONN,
const CS_STRING & sBindHost = "",
uint32_t iTimeout = 0,
bool bDetach = false )
virtual

Listens for connections.

Parameters
iPortthe port to listen on
iMaxConnsthe maximum amount of pending connections to allow
sBindHostthe vhost on which to listen
iTimeoutif no connections come in by this timeout, the listener is closed
bDetachdon't block waiting for port to come up, instead detach and return immediately

Reimplemented in CSocket.

References CS_STRING.

Referenced by CSocket::operator=().

◆ Listening()

virtual void Csock::Listening ( const CS_STRING & sBindIP,
uint16_t uPort )
inlinevirtual

called when type is LISTENER and the listening port is up and running

Parameters
sBindIPthe IP that is being bound to. Empty if no bind restriction
uPortthe listening port

References CS_STRING.

◆ ListenUnix()

virtual bool Csock::ListenUnix ( const CS_STRING & sBindFile,
int iMaxConns = SOMAXCONN,
uint32_t iTimeout = 0 )
virtual

Listens for connections on an UNIX socket.

Parameters
sBindFilethe socket on which to listen
iMaxConnsthe maximum amount of pending connections to allow
iTimeoutif no connections come in by this timeout, the listener is closed

References CS_STRING.

◆ MonitorFD()

void CSockCommon::MonitorFD ( CSMonitorFD * pMonitorFD)
inlineinherited

add an FD set to monitor

References m_vcMonitorFD.

◆ NonBlockingIO()

void Csock::NonBlockingIO ( )

Use this to change your fd's to blocking or none blocking.

◆ operator<<() [1/8]

Csock & Csock::operator<< ( const CS_STRING & s)

References Csock(), and CS_STRING.

◆ operator<<() [2/8]

Csock & Csock::operator<< ( double i)

References Csock().

◆ operator<<() [3/8]

Csock & Csock::operator<< ( float i)

References Csock().

◆ operator<<() [4/8]

Csock & Csock::operator<< ( int32_t i)

References Csock().

◆ operator<<() [5/8]

Csock & Csock::operator<< ( int64_t i)

References Csock().

◆ operator<<() [6/8]

Csock & Csock::operator<< ( std::ostream &(* io )(std::ostream &))

References Csock().

◆ operator<<() [7/8]

Csock & Csock::operator<< ( uint32_t i)

References Csock().

◆ operator<<() [8/8]

Csock & Csock::operator<< ( uint64_t i)

References Csock().

◆ PauseRead()

void Csock::PauseRead ( )

will pause/unpause reading on this socket

◆ PushBuff()

virtual void Csock::PushBuff ( const char * data,
size_t len,
bool bStartAtZero = false )
virtual

pushes data up on the buffer, if a line is ready it calls the ReadLine event

◆ ReachedMaxBuffer()

virtual void Csock::ReachedMaxBuffer ( )
virtual

This WARNING event is called when your buffer for readline exceeds the warning threshold and triggers this event.

Either Override it and do nothing, or SetMaxBufferThreshold() This event will only get called if m_bEnableReadLine is enabled

Reimplemented in CClient, CIncomingConnection, CIRCSock, and CSocket.

◆ Read()

virtual cs_ssize_t Csock::Read ( char * data,
size_t len )
virtual

Read from the socket Just pass in a pointer, big enough to hold len bytes.

Parameters
datathe buffer to read into
lenthe size of the buffer
Returns
Returns READ_EOF for EOF Returns READ_ERR for ERROR Returns READ_EAGAIN for Try Again ( EAGAIN ) Returns READ_CONNREFUSED for connection refused Returns READ_TIMEDOUT for a connection that timed out at the TCP level Otherwise returns the bytes read into data

◆ ReadData()

virtual void Csock::ReadData ( const char * data,
size_t len )
inlinevirtual

Ready to read data event.

Reimplemented in CHTTPSock.

◆ ReadLine()

virtual void Csock::ReadLine ( const CS_STRING & sLine)
inlinevirtual

Ready to Read a full line event.

If encoding is provided, this is guaranteed to be UTF-8

References CS_STRING.

◆ ReadPaused()

virtual void Csock::ReadPaused ( )
inlinevirtual

This gets called every iteration of CSocketManager::Select() if the socket is ReadPaused.

◆ ResetBytesRead()

void Csock::ResetBytesRead ( )

◆ ResetBytesWritten()

void Csock::ResetBytesWritten ( )

◆ ResetStartTime()

void Csock::ResetStartTime ( )

Resets the start time.

◆ ResetTimer()

virtual void Csock::ResetTimer ( )
virtual

resets the time counter, this is virtual in the event you need an event on the timer being Reset

◆ SetAFRequire()

void Csock::SetAFRequire ( CSSockAddr::EAFRequire iAFRequire)
inline

◆ SetBindHost()

void Csock::SetBindHost ( const CS_STRING & sBindHost)
inline

References CS_STRING.

◆ SetCertVerifyCB()

void Csock::SetCertVerifyCB ( FPCertVerifyCB pFP)
inline

setting this to NULL will allow the default openssl verification process kick in

◆ SetCipher()

void Csock::SetCipher ( const CS_STRING & sCipher)

Set the cipher type ( openssl cipher [to see ciphers available] )

References CS_STRING.

◆ SetConState()

void Csock::SetConState ( ECONState eState)
inline

sets the connection state to eState

◆ SetCTXObject()

void Csock::SetCTXObject ( SSL_CTX * sslCtx,
bool bDeleteExisting = false )

◆ SetDHParamLocation()

void Csock::SetDHParamLocation ( const CS_STRING & sDHParamFile)

Set the pem file location.

References CS_STRING.

◆ SetEncoding()

void Csock::SetEncoding ( const CS_STRING & sEncoding)

References CS_STRING.

◆ SetHostName()

void Csock::SetHostName ( const CS_STRING & sHostname)

References CS_STRING.

◆ SetIPv6()

void Csock::SetIPv6 ( bool b)
inline

◆ SetIsConnected()

virtual void Csock::SetIsConnected ( bool b)
virtual

Sets the sock, telling it its connected (internal use only)

◆ SetKeyLocation()

void Csock::SetKeyLocation ( const CS_STRING & sKeyFile)

References CS_STRING.

◆ SetMaxBufferThreshold()

void Csock::SetMaxBufferThreshold ( uint32_t iThreshold)

sets the max buffered threshold when EnableReadLine() is enabled

◆ SetParentSockName()

virtual void Csock::SetParentSockName ( const CS_STRING & sParentName)
virtual

Set The INBOUND Parent sockname.

References CS_STRING.

◆ SetPemLocation()

void Csock::SetPemLocation ( const CS_STRING & sPemFile)

References CS_STRING.

◆ SetPemPass()

void Csock::SetPemPass ( const CS_STRING & sPassword)

References CS_STRING.

◆ SetPort()

void Csock::SetPort ( uint16_t iPort)

◆ SetRate()

virtual void Csock::SetRate ( uint32_t iBytes,
uint64_t iMilliseconds )
virtual

sets the rate at which we can send data

Parameters
iBytesthe amount of bytes we can write
iMillisecondsthe amount of time we have to rate to iBytes

◆ SetRequireClientCertFlags()

void Csock::SetRequireClientCertFlags ( uint32_t iRequireClientCertFlags)
inline

bitwise flags, 0 means don't require cert, SSL_VERIFY_PEER verifies peers, SSL_VERIFY_FAIL_IF_NO_PEER_CERT will cause the connection to fail if no cert

◆ SetRequiresClientCert()

void Csock::SetRequiresClientCert ( bool bRequiresCert)

legacy, deprecated

See also
SetRequireClientCertFlags

◆ SetRSock()

void Csock::SetRSock ( cs_sock_t iSock)

Referenced by CExecSock::~CExecSock().

◆ SetSkipConnect()

void Csock::SetSkipConnect ( bool b)
inline

◆ SetSock()

void Csock::SetSock ( cs_sock_t iSock)

◆ SetSockName()

void Csock::SetSockName ( const CS_STRING & sName)

References CS_STRING.

◆ SetSSL()

void Csock::SetSSL ( bool b)

◆ SetSSLMethod()

void Csock::SetSSLMethod ( int iMethod)

Set the SSL method type.

◆ SetSSLObject()

void Csock::SetSSLObject ( SSL * ssl,
bool bDeleteExisting = false )

◆ SetTimeout()

void Csock::SetTimeout ( int iTimeout,
uint32_t iTimeoutType = TMO_ALL )

Currently this uses the same value for all timeouts, and iTimeoutType merely states which event will be checked for timeouts.

References TMO_ALL.

◆ SetTimeoutType()

void Csock::SetTimeoutType ( uint32_t iTimeoutType)

◆ SetType()

void Csock::SetType ( int iType)

◆ SetupServerCTX()

SSL_CTX * Csock::SetupServerCTX ( )

creates a new SSL_CTX based on the setup of this sock

◆ SetupVHost()

bool Csock::SetupVHost ( )

this is only used on outbound connections, listeners bind in a different spot

◆ SetWSock()

void Csock::SetWSock ( cs_sock_t iSock)

Referenced by CExecSock::~CExecSock().

◆ SNIConfigureClient()

virtual bool Csock::SNIConfigureClient ( CS_STRING & sHostname)
virtual

called to configure the SNI client

Parameters
sHostname,thehostname to configure SNI with, you can fill this with GetHostname() if its a valid hostname and not an OP
Returns
returning true causes a call to configure SNI with the hostname returned

References CS_STRING.

◆ SNIConfigureServer()

virtual bool Csock::SNIConfigureServer ( const CS_STRING & sHostname,
CS_STRING & sPemFile,
CS_STRING & sPemPass )
inlinevirtual

gets called when a SNI request is sent, and used to configure a SNI session

Parameters
sHostnamethe hostname sent from the client
sPemFilefill this with the location to the pemfile
sPemPassfill this with the pemfile password if there is one
Returns
return true to proceed with the SNI server configuration

References CS_STRING.

◆ SockError()

virtual void Csock::SockError ( int iErrno,
const CS_STRING & sDescription )
inlinevirtual

A sock error occured event.

References CS_STRING.

◆ SSLClientSetup()

virtual bool Csock::SSLClientSetup ( )
virtual

This sets up the SSL Client, this is used internally.

◆ SSLFinishSetup()

virtual void Csock::SSLFinishSetup ( SSL * pSSL)
inlinevirtual

Gets called immediatly after the m_ssl member is setup and initialized, useful if you need to assign anything to this ssl session via SSL_set_ex_data.

◆ SSLHandShakeFinished()

virtual void Csock::SSLHandShakeFinished ( )
inlinevirtual

called once the SSL handshake is complete, this is triggered via SSL_CB_HANDSHAKE_DONE in SSL_set_info_callback()

This is a spot where you can look at the finished peer certifificate ... IE

X509 * pCert = GetX509();
char szName[256];
memset( szName, '\0', 256 );
X509_NAME_get_text_by_NID ( X509_get_subject_name( pCert ), NID_commonName, szName, 255 );
cerr << "Name! " << szName << endl;
X509_free( pCert );

Reimplemented in CZNCSock.

◆ SslIsEstablished()

bool Csock::SslIsEstablished ( ) const

is SSL_accept finished ?

is the ssl properly finished (from write no error)

◆ SSLServerSetup()

virtual bool Csock::SSLServerSetup ( )
virtual

This sets up the SSL Server, this is used internally.

◆ StartTLS()

bool Csock::StartTLS ( )

start a TLS connection on an existing plain connection

◆ Timeout()

virtual void Csock::Timeout ( )
inlinevirtual

Sock Timed out event.

Reimplemented in CClient, and CIRCSock.

◆ UnPauseRead()

void Csock::UnPauseRead ( )

◆ VerifyPeerCertificate()

virtual int Csock::VerifyPeerCertificate ( int iPreVerify,
X509_STORE_CTX * pStoreCTX )
inlinevirtual

this is hooked in via SSL_set_verify, and be default it just returns 1 meaning success

Parameters
iPreVerifythe pre-verification status as determined by openssl internally
pStoreCTXthe X509_STORE_CTX containing the certificate
Returns
1 to continue, 0 to abort

This may get called multiple times, for example with a chain certificate which is fairly typical with certificates from godaddy, freessl, etc. Additionally, openssl does not do any host verification, they leave that up to the you. One easy way to deal with this is to wait for SSLHandShakeFinished() and examine the peer certificate

See also
SSLHandShakeFinished

Reimplemented in CZNCSock.

◆ Write() [1/2]

virtual bool Csock::Write ( const char * data,
size_t len )
virtual

Write data to the socket.

If not all of the data is sent, it will be stored on an internal buffer, and tried again with next call to Write if the socket is blocking, it will send everything, its ok to check ernno after this (nothing else is processed)

Parameters
datathe data to send
lenthe length of data

◆ Write() [2/2]

virtual bool Csock::Write ( const CS_STRING & sData)
virtual

Write a text string to the socket.

Encoding is used, if set

Parameters
sDatathe string to send; if encoding is provided, sData should be UTF-8 and will be encoded
See also
Write( const char *, int )

References CS_STRING.

Member Data Documentation

◆ m_vcCrons

std::vector<CCron *> CSockCommon::m_vcCrons
protectedinherited

Referenced by GetCrons().

◆ m_vcMonitorFD

std::vector<CSMonitorFD *> CSockCommon::m_vcMonitorFD
protectedinherited

Referenced by MonitorFD().


The documentation for this class was generated from the following file: