Purpose: Acivate listening socket. This creates a sock and then binds it to a port. .
| Return Type | Function name | Arguments |
|---|---|---|
| hzEcode | hzIpListen::Activate | (void) |
Declared in file: hzIpServer.h
Defined in file : hzIpServer.cpp
Function Logic:
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 ;
}