Swatcat
Swatcat

Reputation: 55

C++ Socket Connect Issue

I have a socket connect function, the issue is that if the client is started before the server, the connection shows as connected, but for some reason returns fails. I am not sure where the failure is and would really appreciate any help:

The function is:

bool IPV4Socket::Connect( std::string hostname
                    , unsigned short remotePort
                    , TimeoutValue *timeout )
{
    AddrInfo getResults;
    AddrInfo getaddrinfoHints;
    int connReturn = 0;
    SockAddr_In *addrData;
    bool connectSuccess = false;
    std::string service = std::to_string( remotePort );

    getaddrinfoHints.ai_family = AddressFamily_inet;
    getaddrinfoHints.ai_socktype = SockType_stream;

    if ( m_socketAdaptor->getaddrinfo( hostname
                                 , service
                                 , &getaddrinfoHints
                                 , &getResults ) != 0 )
    {
        return false;
    }

    addrData = (SockAddr_In *)&( *getResults.ai_addr.begin() );

    connReturn = m_socketAdaptor->connect( m_socket
                                         , (const Sockaddr *)addrData
                                         , (int)getResults.ai_addrlen );

    if ( connReturn == SocketError)
    {
        int m_lastErrorCode = m_socketAdaptor->GetLastError();

        //  Connection error : FATAL 
        if ( ( m_lastErrorCode != SockErr_EWOULDBLOCK) &&
             ( m_lastErrorCode != SockErr_EALREADY ) )
        {
            connectSuccess = false;
        }
        else
        {
           SocketSet writeFDS;
           SocketSet exceptFDS;
           int selectReturn = 0;

           //  Clear all the socket FDS structures
           SocketSet_ZERO( &writeFDS );
           SocketSet_ZERO( &exceptFDS );

           //  Put the socket into the FDS structures
           SocketSet_SET( m_socket, &writeFDS );
           SocketSet_SET( m_socket, &exceptFDS );

           selectReturn = m_socketAdaptor->select( -1
                                                 , NULL
                                              , &writeFDS
                                              , &exceptFDS
                                              , timeout );

           if ( selectReturn == SocketError )
           {
               //  Any errors are bad
               connectSuccess = false;
           }
           else if ( selectReturn > 0 )
           {
                //  Check for error (exception) first
                if ( m_socketAdaptor->SocketSet_ISSET( m_socket, &exceptFDS ) )
                {
                    connectSuccess = false;
                }
                else if ( m_socketAdaptor->SocketSet_ISSET( m_socket, &writeFDS ) )
                {
                    //   Select returned 'writable', we're connected!
                    connectSuccess = true;
                    m_isConnected = true;
                }
            }
        }
    }
    else
    {
        connectSuccess = true;
        m_isConnected = true;
    }

    return connectSuccess;
}

I am not sure if I am missing the point, or if I have overly complicated the function.

Helllp :)

Notes: * By the way, m_socketAdaptor-> functions are just wrappers. * If you start server and then client, it works...

Upvotes: 0

Views: 405

Answers (1)

user207421
user207421

Reputation: 311023

You can't reconnect a socket which has already failed to connect. You have to close it and create a new socket. Therefore that should be done in the connect method, not wherever it is done now.

Upvotes: 1

Related Questions