C++ 套接字连接问题

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

我不确定我是否忽略了重点,或者我是否将函数过于复杂了。

你好 :)

注意事项: * 顺便说一下,m_socketAdaptor-> 函数只是包装器。 * 如果你先启动服务器,然后再启动客户端,它会工作...

最佳答案

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

关于C++ 套接字连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35481798/

相关文章:

c# - 打印具有空节点的二叉树

c++ - gcc shared_ptr复制赋值实现

windows - Windows Server 2008 支持 MSDE 吗?

c - 从非阻塞 C 套接字读取大数据

c# - 在局域网中查找可连接的游戏服务器

c++ - 将多个目标组合成一个目标

c++ - 异步使用线程池?

php - 如何为 MySQL 远程数据库连接设置 Windows Server 2008?

windows - 如何在 Windows 上将 svn 存储库转换为 git

c - 未收到完整数据