Purpose: Acivate listening socket. This creates a sock and then binds it to a port. .

Return TypeFunction nameArguments
hzEcodehzIpListen::Activate(void)

Declared in file: hzIpServer.h
Defined in file : hzIpServer.cpp

Function Logic:

0:START 1:unknown 2:unknown 3:unknown 4:Return hzerr(E_NOSOCKET,Could not create UDP server socket (errno=%d),errno) 5:unknown 6:Return hzerr(E_NOSOCKET,Could not create TCP server socket (errno=%d),errno) 7:items m_Unix items sys_rc 8:unknown 9:unknown 10:Return hzerr(E_CORRUPT,Could not close socket %d (port %d) after bind_fail. Errno=%d,m_nSocket,m_nPort,errno) 11:Return hzerr(E_NOSOCKET,Server could not bind to port %d,m_nPort) 12:unknown 13:items 14:unknown 15:items 16:Return E_NOSOCKET 17:unknown 18:unknown 19:Return hzerr(E_NOSOCKET,Could not create UDP server socket (errno=%d),errno) 20:unknown 21:Return hzerr(E_NOSOCKET,Could not create TCP server socket (errno=%d),errno) 22:items m_Address m_Address m_Address 23:unknown 24:sys_rc 25:unknown 26:items 27:unknown 28:Return hzerr(E_CORRUPT,Could not close socket %d (port %d) after bind_fail. Errno=%d,m_nSocket,m_nPort,errno) 29:unknown 30:Return E_NOSOCKET 31:items 32:unknown 33:unknown 34:items 35:unknown 36:items 37:Return E_NOSOCKET 38:Return E_OK

Function body:

hzEcode hzIpListen::Activate (void)
{
   //  Purpose: Acivate listening socket. This creates a sock and then binds it to a port.
   //  
   //  Arguments: None.
   //  
   //  Returns: E_NOSOCKET If listening socket bound to port,
   //     E_OK  If operation successful
   _hzfunc("hzIpListen::Activate") ;
   uint32_t    nTries ;        //  Number of attempts to bind (give up after 5)
   int32_t     sys_rc ;        //  Return from bind call
   //  Allocate and bind a listening socket
   if (m_bOpflags & HZ_LISTEN_UNIX)
   {
       //  Allocate the listening socket
       if (m_bOpflags & HZ_LISTEN_UDP)
       {
           if ((m_nSocket = socket(AF_UNIX, SOCK_DGRAM, 0))< 0)
               return hzerr(E_NOSOCKET, "Could not create UDP server socket (errno=%d)", errno) ;
       }
       else
       {
           if ((m_nSocket = socket(AF_UNIX, SOCK_STREAM, 0))< 0)
               return hzerr(E_NOSOCKET, "Could not create TCP server socket (errno=%d)", errno) ;
       }
       //  Prepare the address
       memset(&m_Unix, 0,sizeof(SOCKADDRUN)) ;
       m_Unix.sun_family = AF_UNIX ;
       strcpy(m_Unix.sun_path, *m_SockFile) ;
       //  sys_rc = bind(m_nSocket, (SOCKADDR*) &m_Unix, sizeof(m_Address)) ;
       sys_rc = bind(m_nSocket, (SOCKADDR*) &m_Unix, sizeof(m_Unix)) ;
       if (sys_rc < 0)
       {
           if (close(m_nSocket) < 0)
               return hzerr(E_CORRUPT, "Could not close socket %d (port %d) after bind_fail. Errno=%d", m_nSocket, m_nPort, errno) ;
           return hzerr(E_NOSOCKET, "Server could not bind to port %d", m_nPort) ;
       }
       if (listen(m_nSocket, 5)< 0)
       {
           hzwarn(E_NOSOCKET, "Server listening socket (sock %d) is not listening Errno=%d", m_nSocket, errno) ;
           if (close(m_nSocket) < 0)
               hzwarn(E_CORRUPT, "Could not close socket %d after listen_fail. Errno=%d", m_nSocket, errno) ;
           return E_NOSOCKET ;
       }
   }
   else
   {
       //  Allocate the listening socket
       if (m_bOpflags & HZ_LISTEN_UDP)
       {
           if ((m_nSocket = socket(AF_INET, SOCK_DGRAM, 0))< 0)
               return hzerr(E_NOSOCKET, "Could not create UDP server socket (errno=%d)", errno) ;
       }
       else
       {
           if ((m_nSocket = socket(AF_INET, SOCK_STREAM, 0))< 0)
               return hzerr(E_NOSOCKET, "Could not create TCP server socket (errno=%d)", errno) ;
       }
       //  Prepare the address
       memset(&m_Address, 0,sizeof(SOCKADDRIN)) ;
       m_Address.sin_family = AF_INET ;
       m_Address.sin_addr.s_addr = htonl(INADDR_ANY) ;
       m_Address.sin_port = htons(m_nPort) ;
       for (nTries = 1; nTries <&eq; 5; nTries++)
       {
           sys_rc = bind(m_nSocket, (SOCKADDR*) &m_Address, sizeof(m_Address)) ;
           if (sys_rc < 0)
           {
               hzwarn(E_NOSOCKET, "Server could not bind to port %d (attempt %d)", m_nPort, nTries) ;
               if (close(m_nSocket) < 0)
                   return hzerr(E_CORRUPT, "Could not close socket %d (port %d) after bind_fail. Errno=%d", m_nSocket, m_nPort, errno) ;
               if (nTries == 5)
                   return E_NOSOCKET ;
               sleep(5);
               continue ;
           }
           break ;
       }
       if (!(m_bOpflags & HZ_LISTEN_UDP))
       {
           if (listen(m_nSocket, 5)< 0)
           {
               hzwarn(E_NOSOCKET, "Server listening socket (sock %d) is not listening on port %d. Errno=%d", m_nSocket, m_nPort, errno) ;
               if (close(m_nSocket) < 0)
                   hzwarn(E_CORRUPT, "Could not close socket %d after listen_fail. Errno=%d", m_nSocket, errno) ;
               return E_NOSOCKET ;
           }
       }
   }
   return E_OK ;
}