1

I created two win32 server c++ projects both will do similar task like listen for IPC connection from client. both will listen in different port numbers like 1000 and 2000, I'm able to connect first started application like 1000 or 2000 but not both, every second connection request will through timeout at client side.

Below I added my client and server code, I have two server applications with different port no (1000 and 2000) and two client applications which connect to 1000 and 2000 port server app.

Both server apps will go for listening mode but one only take connection request another will throw timeout at client application. if any suggestion please update your comments.

Client Code :

      void Initialize()
    {
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2, 2), &WSAData);
    }
    
    SOCKET CloseSocket(SOCKET _Socket)
    {
        /*A shutdown() closes SOCK_STREAM sockets gracefully. Both processes can acknowledge that they are no longer sending. OR Disable sends and/or receives on a socket*/
        shutdown(_Socket,SD_BOTH);
        /*The closesocket function closes an existing socket.*/
        closesocket(_Socket);
        return _Socket = INVALID_SOCKET;
    }
    
    SOCKET Connect( SOCKET _Socket, 
                                    SOCKADDR_IN _Addres )
    {           
        int connectResult   = connect(_Socket,(struct sockaddr *)&_Addres,sizeof(_Addres));       
        if(connectResult == SOCKET_ERROR)
        {
            _Socket = CloseSocket(_Socket);     
        }
        else if(connectResult == ETIMEDOUT)
        {       
            _Socket = CloseSocket(_Socket);
        }   
        return _Socket;
    }
    
    
    SOCKET ClientSocketPipline(SOCKET _Socket)
    {   
        /*Socket types are defined in sys/socket.h. These types--SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW--are supported by AF_INET and AF_UNIX. The following creates a stream socket in the Internet domain:*/
        if ((_Socket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {           
            return _Socket = CloseSocket(_Socket);      
        }
        
        struct timeval timeout;   
        memset(&timeout,0,sizeof(timeout));
        timeout.tv_sec  = 2;
        timeout.tv_usec = 0;    
        if (    setsockopt (_Socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0 && 
                setsockopt (_Socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0    )
        {       
            return _Socket = CloseSocket(_Socket);      
        }       
        return _Socket;
    }
    
    void ClientConnectionCall()
    {
        SOCKET ConnectSocket;
        ConnectSocket   = INVALID_SOCKET;   
        ConnectSocket   = ClientSocketPipline(ConnectSocket);   
        SOCKADDR_IN SocketAddres;
                memset(&SocketAddres,0,sizeof(SocketAddres));       
                /*Convert IPv4 and IPv6 addresses from text to binary form*/
                if(inet_pton(AF_INET,"192.160.1.1", &SocketAddres.sin_addr.s_addr)>0) 
                {           
                    SocketAddres.sin_port       = htons(1000); // and 2000
                    SocketAddres.sin_family     = AF_INET;           
                    ConnectSocket               = Connect(ConnectSocket, SocketAddres);         
                }
    }

int _tmain(int argc, _TCHAR* argv[])
{
    Initialize(); 
    ClientConnectionCall(); 
    return 0;
}

Server Code listener (Port no : 1000) :

SOCKET ServerClass::CloseSocket(SOCKET _Socket)
{
    /*A shutdown() closes SOCK_STREAM sockets gracefully. Both processes can acknowledge that they are no longer sending. OR Disable sends and/or receives on a socket*/
    shutdown(_Socket,SD_BOTH);
    /*The closesocket function closes an existing socket.*/
    closesocket(_Socket);
    return _Socket = INVALID_SOCKET;
}

SOCKET ServerClass::Bind(SOCKET _Socket, SOCKADDR_IN _Address)
{               
    /*bind : Associate a local address with a socket.*/
    if(::bind(_Socket,(struct sockaddr*)&_Address,sizeof(_Address)) == SOCKET_ERROR)
    {       
        _Socket = CloseSocket(_Socket); 
    }   
    return _Socket;
}

SOCKET ServerClass::ServerSocketPipline(SOCKET _Socket,int _Type)
{
    /*Socket types are defined in sys/socket.h. These types--SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW--are supported by AF_INET and AF_UNIX. The following creates a stream socket in the Internet domain:*/
    if ((_Socket = socket(AF_INET, _Type, 0)) < 0)
    {               
        return _Socket = CloseSocket(_Socket);      
    }

    int opt = 1; 
    /* Set socket keep connections alive */
    if (setsockopt(_Socket,SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) == SOCKET_ERROR)
    {       
        return _Socket = CloseSocket(_Socket);  
    }   
    return _Socket;
}

SOCKET ServerClass::CreateSocket(SOCKET _Socket, int _Port)
{
    _Socket     = INVALID_SOCKET;   
    _Socket     = ServerSocketPipline(_Socket, SOCK_STREAM);

    SOCKADDR_IN SocketAddres;
    memset(&SocketAddres,0,sizeof(SocketAddres));   

    SocketAddres.sin_addr.s_addr    = htonl(INADDR_ANY);
    SocketAddres.sin_port           = htons(_Port);
    SocketAddres.sin_family         = AF_INET;

    //Associate a local address with a socket.
    _Socket = Bind( _Socket, SocketAddres   );

    /*Establish a socket to listen for incoming connection*/
    if(::listen(_Socket, 5) != SOCKET_ERROR)
    {   
        //Socket listen success.
    }
    else
    {                   
        //Socket listen failed.    
        _Socket = SOCKET_ERROR;
    }   
    return _Socket;
}

DWORD WINAPI ServerClass::SocketListener(LPVOID threadParam)
{
    if(threadParam != NULL)
    {             
            ServerClass *thisClass = (ServerClass *)threadParam;

            SOCKET tempSocket   = INVALID_SOCKET;
            socklen_t addrlen   = sizeof(struct sockaddr_in);
            SOCKADDR_IN SocketAddres;
            memset(&SocketAddres,0,sizeof(SocketAddres));   

            SocketAddres.sin_addr.s_addr    = htonl(INADDR_ANY);
            SocketAddres.sin_port           = htons(1000);
            SocketAddres.sin_family     = AF_INET;

            if(thisClass->m_BindSock != INVALID_SOCKET)
            {                               
                /*Accept a connection on a socket.*/
                tempSocket = ::accept(  thisClass->m_BindSock, (struct sockaddr*)&SocketAddres, &addrlen);
                if(tempSocket != INVALID_SOCKET)                    
                {                                                       
                    SetEvent(thisClass->m_SocketThreadHandle); 
                }
                else
                {                           
                    tempSocket = thisClass->CloseSocket(tempSocket);  
                    SetEvent(thisClass->m_SocketThreadHandle); 
                }                                       

            }
    }  
    return 0;
}


ServerClass::ServerMainCall(void)
{
     Initialize();
     m_BindSock = CreateSocket(m_BindSock,1000);
     m_SocketThreadHandle = CreateThread(NULL, 0, SocketListener, this, 0, NULL);
       
      WaitForSingleObject(m_SocketThreadHandle,INFINITE);

      int msgboxID = MessageBox( NULL,  L"Connection request received from first client",   L"",
                            MB_ICONEXCLAMATION | MB_OK );

                
}

Server Code listener (Port no : 2000) :

SOCKET ServerClass::CloseSocket(SOCKET _Socket)
{
    /*A shutdown() closes SOCK_STREAM sockets gracefully. Both processes can acknowledge that they are no longer sending. OR Disable sends and/or receives on a socket*/
    shutdown(_Socket,SD_BOTH);
    /*The closesocket function closes an existing socket.*/
    closesocket(_Socket);
    return _Socket = INVALID_SOCKET;
}

SOCKET ServerClass::Bind(SOCKET _Socket, SOCKADDR_IN _Address)
{               
    /*bind : Associate a local address with a socket.*/
    if(::bind(_Socket,(struct sockaddr*)&_Address,sizeof(_Address)) == SOCKET_ERROR)
    {       
        _Socket = CloseSocket(_Socket); 
    }   
    return _Socket;
}

SOCKET ServerClass::ServerSocketPipline(SOCKET _Socket,int _Type)
{
    /*Socket types are defined in sys/socket.h. These types--SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW--are supported by AF_INET and AF_UNIX. The following creates a stream socket in the Internet domain:*/
    if ((_Socket = socket(AF_INET, _Type, 0)) < 0)
    {               
        return _Socket = CloseSocket(_Socket);      
    }

    int opt = 1; 
    /* Set socket keep connections alive */
    if (setsockopt(_Socket,SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) == SOCKET_ERROR)
    {       
        return _Socket = CloseSocket(_Socket);  
    }  
    return _Socket;
}

SOCKET ServerClass::CreateSocket(SOCKET _Socket, int _Port)
{
    _Socket     = INVALID_SOCKET;   
    _Socket     = ServerSocketPipline(_Socket, SOCK_STREAM);

    SOCKADDR_IN SocketAddres;
    memset(&SocketAddres,0,sizeof(SocketAddres));   

    SocketAddres.sin_addr.s_addr    = htonl(INADDR_ANY);
    SocketAddres.sin_port           = htons(_Port);
    SocketAddres.sin_family         = AF_INET;

    //Associate a local address with a socket.
    _Socket = Bind( _Socket, SocketAddres   );

    /*Establish a socket to listen for incoming connection*/
    if(::listen(_Socket, 5) != SOCKET_ERROR)
    {   
        //Socket listen success.
    }
    else
    {                   
        //Socket listen failed.   
        _Socket = SOCKET_ERROR;
    }   
    return _Socket;
}

DWORD WINAPI ServerClass::SocketListener(LPVOID threadParam)
{
    if(threadParam != NULL)
    {         
           ServerClass *thisClass = (ServerClass *)threadParam;

            SOCKET tempSocket   = INVALID_SOCKET;
            socklen_t addrlen   = sizeof(struct sockaddr_in);
            SOCKADDR_IN SocketAddres;
            memset(&SocketAddres,0,sizeof(SocketAddres));   

            SocketAddres.sin_addr.s_addr    = htonl(INADDR_ANY);
            SocketAddres.sin_port           = htons(2000);
            SocketAddres.sin_family     = AF_INET;

            if(thisClass->m_BindSock != INVALID_SOCKET)
            {                               
                /*Accept a connection on a socket.*/
                tempSocket = ::accept(  thisClass->m_BindSock, (struct sockaddr*)&SocketAddres, &addrlen);
                if(tempSocket != INVALID_SOCKET)                    
                {                                                       
                    SetEvent(thisClass->m_SocketThreadHandle); 
                }
                else
                {                               
                    tempSocket = thisClass->CloseSocket(tempSocket);    
                    SetEvent(thisClass->m_SocketThreadHandle); 
                }                                       
            }   
    }   
    return 0;
}


ServerClass::ServerMainCall(void)
{
     Initialize();
     m_BindSock = CreateSocket(m_BindSock,2000);  
     m_SocketThreadHandle = CreateThread(NULL, 0, SocketListener, this, 0, NULL);
   
      WaitForSingleObject(m_SocketThreadHandle,INFINITE);

      int msgboxID = MessageBox( NULL,L"Connection request received from second client",L"",
                            MB_ICONEXCLAMATION | MB_OK);

}
Krish
  • 376
  • 3
  • 14

1 Answers1

0

Finally found the answer to the problem. The issue is because of the firewall blocking at server machine side. After disable it, things started working, for more details please go to the below link:

What can be the reasons of connection refused errors?

Remy Lebeau
  • 555,201
  • 31
  • 458
  • 770
Krish
  • 376
  • 3
  • 14