accept не принимает коннект
От: WhiteDove  
Дата: 14.12.11 16:09
Оценка:
клиент-серверная система.

Клиент шлет пакеты на соединение, сервер делает listen и accept.
Соединение с сервером не наступает никогда.

Сниффер показывает, что на машину, на которой установлен сервер, приходят пакеты от клиента.
Но цикл accept'а никогда не проваливается внутрь.

Биндиться пробовал как на ноль, так и на конкретный адрес. пофигу. accept'а нет.

Код сервера:
(жирным выделен код, на котором висяк)

        if( ( m_Socket = ::socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
        {
            int err = WSAGetLastError();
            LOG_ERROR( L"socket() return %d", err);
            return stt::error;
        }
226:        LOG_LINE();
        sockaddr_in local_addr;
        local_addr.sin_family = AF_INET;
        local_addr.sin_port = htons( m_Port );
        std::string tempstr;
        local_addr.sin_addr.s_addr = inet_addr((tempstr = std::string(m_Host.begin(), m_Host.end())).c_str());

        if( ::bind( m_Socket, (sockaddr *)&local_addr, sizeof( local_addr ) ) )
        {
            int err = WSAGetLastError();
            LOG_ERROR( L"bind() return %d", err);
            ::shutdown(m_Socket, SD_BOTH);
            ::closesocket( m_Socket );
            return stt::error;
        }
241:        LOG_LINE();
        if( ::listen( m_Socket, 0x100 ) )
        {
            int err = WSAGetLastError();
            LOG_ERROR( L"listen() return %d", err);
            ::shutdown(m_Socket, SD_BOTH);
            ::closesocket( m_Socket );
            return stt::error;
        }
250:        LOG_LINE();
        typ::socket client_socket;
        sockaddr_in client_addr;

        int client_addr_size = sizeof( client_addr );

        while( INVALID_SOCKET != ( client_socket = accept( m_Socket, (sockaddr*)&client_addr, &client_addr_size ) ) )
        {
258:            LOG_LINE();
            LOG_NOTE(L"Main server cycle, WSAGetLastError trace: %d", WSAGetLastError());
            typ::hostent* hst = ::gethostbyaddr( (char*)&client_addr.sin_addr.s_addr, 4, AF_INET );

            //printf("+%s [%s] new connect!\n", (hst)?hst->h_name:"", inet_ntoa(client_addr.sin_addr));

            // SPS : 22.04.2011
            // Почему-то на Windows 7 x64 inet_ntoa возвращала имя компа, а не его IP в виде "X.X.X.X"
            // Переделал получение строки с IP-адресом через sprintf.
            char ip_addr_buff[32];
            memset(ip_addr_buff, 0, sizeof(ip_addr_buff));
            sprintf(ip_addr_buff, "%d.%d.%d.%d", client_addr.sin_addr.S_un.S_un_b.s_b1,
                                                client_addr.sin_addr.S_un.S_un_b.s_b2,
                                                client_addr.sin_addr.S_un.S_un_b.s_b3,
                                                client_addr.sin_addr.S_un.S_un_b.s_b4);
            // Создаем новый объект агента
            LOG_CONSOLE(CONS_COLOR_GREEN, "=> New agent %s\n", ip_addr_buff);
            //
            srv::Agent* agent = new srv::Agent( this, client_socket, ip_addr_buff, htons( client_addr.sin_port ) );
            if( !agent )
                continue;

            // Добавляем агента в список агентов
            {
                LOCK(m_Guard);
                m_ListAgents.push_back( agent );
            }

            // Запускаем агента
            agent->Start();
        }
        LOG_ERROR(L"Main server cycle crashed with WSAGetLastError: %d", WSAGetLastError());
    }
    catch (...)
    {
        LOG_CONSOLE(CONS_COLOR_RED, "ERROR: Exception in main server thread!\n");
294:        LOG_LINE();
        LOG_ERROR(L"Exception in main server thread!!!");
    }
297:    LOG_LINE();
    return stt::ok;



номера строк вбил вручную, функция LOG_LINE выводит их в лог. Содержимое лога:


[14.12.2011 19:35:07.201]  [00000A70]  .\pro.server.cpp  (226)  .\pro.server.cpp (226) - program::Server::ThreadProc
[14.12.2011 19:35:07.201]  [00000A70]  .\pro.server.cpp  (241)  .\pro.server.cpp (241) - program::Server::ThreadProc
[14.12.2011 19:35:07.201]  [00000A70]  .\pro.server.cpp  (250)  .\pro.server.cpp (250) - program::Server::ThreadProc
EOF


при этом wireshark говорить, что пара сотен пакетов бесконечного цикла соединения с клиента на сервер пришла. и именно на порт, на который происходит бинд.

что не так?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.