клиент-серверная система.
Клиент шлет пакеты на соединение, сервер делает 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 говорить, что пара сотен пакетов бесконечного цикла соединения с клиента на сервер пришла. и именно на порт, на который происходит бинд.
что не так?