2016-02-18 3 views
0

У меня есть функция подключения сокета, проблема в том, что если клиент запущен до сервера, соединение отображается как подключенное, но почему-то возвращается сбой. Я не уверен, где отказ и был бы очень признателен за любую помощь:Ошибка подключения Socket S ++

Функции:

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-> функции просто фантики. * Если вы запустите сервер, а затем клиент, он работает ...

+0

Что показывает netstat, когда клиент работает до запуска сервера? –

+0

@UmamaheshP с помощью 'netstat -a -p tcp 10' Получаю: TCP 127.0.0.1:51074 WINDEVSRV: 3490 SYN_SENT –

+1

Это ожидаемое поведение. Отправка syn - это первый шаг ручного тряски TCP. Если сервер не прослушивает порт, соединение не будет выполнено. Клиент должен снова попробовать подключиться. –

ответ

1

Вы не можете повторно подключить сокет, который уже не удалось подключиться. Вы должны закрыть его и создать новый сокет. Поэтому это должно быть сделано в методе connect, а не везде, где это делается сейчас.

Смежные вопросы