C ++套接字连接问题

时间:2016-02-18 12:42:20

标签: c++ windows sockets

我有套接字连接功能,问题是如果客户端在服务器之前启动,则连接显示为已连接,但由于某种原因返回失败。我不确定失败的位置,并且非常感谢任何帮助:

功能是:

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;
}

我不确定我是否错过了这一点,或者我是否过度复杂了这个功能。

Helllp:)

注意:    *顺便说一句,m_socketAdaptor->函数只是包装器。    *如果您启动服务器,然后启动客户端,它可以工作......

1 个答案:

答案 0 :(得分:1)

您无法重新连接已无法连接的套接字。您必须关闭它并创建一个新的套接字。因此,应该在connect方法中完成,而不是现在在任何地方完成。