@ -21,8 +21,7 @@
static constexpr auto MAX_WAIT_FOR_IO = 1 s ;
/**
* RAII helper class that manages a socket . Mimics ` std : : unique_ptr ` , but instead of a pointer it
* contains a socket and closes it automatically when it goes out of scope .
* RAII helper class that manages a socket and closes it automatically when it goes out of scope .
*/
class Sock
{
@ -63,43 +62,37 @@ public:
virtual Sock & operator = ( Sock & & other ) ;
/**
* Get the value of the contained socket .
* @ return socket or INVALID_SOCKET if empty
*/
[ [ nodiscard ] ] virtual SOCKET Get ( ) const ;
/**
* send ( 2 ) wrapper . Equivalent to ` send ( this - > Get ( ) , data , len , flags ) ; ` . Code that uses this
* send ( 2 ) wrapper . Equivalent to ` send ( m_socket , data , len , flags ) ; ` . Code that uses this
* wrapper can be unit tested if this method is overridden by a mock Sock implementation .
*/
[ [ nodiscard ] ] virtual ssize_t Send ( const void * data , size_t len , int flags ) const ;
/**
* recv ( 2 ) wrapper . Equivalent to ` recv ( this- > Get ( ) , buf , len , flags ) ; ` . Code that uses this
* recv ( 2 ) wrapper . Equivalent to ` recv ( m_socket , buf , len , flags ) ; ` . Code that uses this
* wrapper can be unit tested if this method is overridden by a mock Sock implementation .
*/
[ [ nodiscard ] ] virtual ssize_t Recv ( void * buf , size_t len , int flags ) const ;
/**
* connect ( 2 ) wrapper . Equivalent to ` connect ( this- > Get ( ) , addr , addrlen ) ` . Code that uses this
* connect ( 2 ) wrapper . Equivalent to ` connect ( m_socket , addr , addrlen ) ` . Code that uses this
* wrapper can be unit tested if this method is overridden by a mock Sock implementation .
*/
[ [ nodiscard ] ] virtual int Connect ( const sockaddr * addr , socklen_t addr_len ) const ;
/**
* bind ( 2 ) wrapper . Equivalent to ` bind ( this- > Get ( ) , addr , addr_len ) ` . Code that uses this
* bind ( 2 ) wrapper . Equivalent to ` bind ( m_socket , addr , addr_len ) ` . Code that uses this
* wrapper can be unit tested if this method is overridden by a mock Sock implementation .
*/
[ [ nodiscard ] ] virtual int Bind ( const sockaddr * addr , socklen_t addr_len ) const ;
/**
* listen ( 2 ) wrapper . Equivalent to ` listen ( this- > Get ( ) , backlog ) ` . Code that uses this
* listen ( 2 ) wrapper . Equivalent to ` listen ( m_socket , backlog ) ` . Code that uses this
* wrapper can be unit tested if this method is overridden by a mock Sock implementation .
*/
[ [ nodiscard ] ] virtual int Listen ( int backlog ) const ;
/**
* accept ( 2 ) wrapper . Equivalent to ` std : : make_unique < Sock > ( accept ( this- > Get ( ) , addr , addr_len ) ) ` .
* accept ( 2 ) wrapper . Equivalent to ` std : : make_unique < Sock > ( accept ( m_socket , addr , addr_len ) ) ` .
* Code that uses this wrapper can be unit tested if this method is overridden by a mock Sock
* implementation .
* The returned unique_ptr is empty if ` accept ( ) ` failed in which case errno will be set .
@ -108,7 +101,7 @@ public:
/**
* getsockopt ( 2 ) wrapper . Equivalent to
* ` getsockopt ( this- > Get ( ) , level , opt_name , opt_val , opt_len ) ` . Code that uses this
* ` getsockopt ( m_socket , level , opt_name , opt_val , opt_len ) ` . Code that uses this
* wrapper can be unit tested if this method is overridden by a mock Sock implementation .
*/
[ [ nodiscard ] ] virtual int GetSockOpt ( int level ,
@ -118,7 +111,7 @@ public:
/**
* setsockopt ( 2 ) wrapper . Equivalent to
* ` setsockopt ( this- > Get ( ) , level , opt_name , opt_val , opt_len ) ` . Code that uses this
* ` setsockopt ( m_socket , level , opt_name , opt_val , opt_len ) ` . Code that uses this
* wrapper can be unit tested if this method is overridden by a mock Sock implementation .
*/
[ [ nodiscard ] ] virtual int SetSockOpt ( int level ,
@ -128,7 +121,7 @@ public:
/**
* getsockname ( 2 ) wrapper . Equivalent to
* ` getsockname ( this- > Get ( ) , name , name_len ) ` . Code that uses this
* ` getsockname ( m_socket , name , name_len ) ` . Code that uses this
* wrapper can be unit tested if this method is overridden by a mock Sock implementation .
*/
[ [ nodiscard ] ] virtual int GetSockName ( sockaddr * name , socklen_t * name_len ) const ;
@ -266,6 +259,11 @@ public:
*/
[ [ nodiscard ] ] virtual bool IsConnected ( std : : string & errmsg ) const ;
/**
* Check if the internal socket is equal to ` s ` . Use only in tests .
*/
bool operator = = ( SOCKET s ) const ;
protected :
/**
* Contained socket . ` INVALID_SOCKET ` designates the object is empty .