клиент-серверная система.
Клиент шлет пакеты на соединение, сервер делает 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 говорить, что пара сотен пакетов бесконечного цикла соединения с клиента на сервер пришла. и именно на порт, на который происходит бинд.
что не так?
Здравствуйте, savitar, Вы писали:
S>Здравствуйте, WhiteDove, Вы писали:
S>1. покажи m_Host
S>2. обнуляй local_addr
S>3. правильно ::socket( PF_INET, к данной проблеме это отношения не имеет, но..
1) Содержимое лога клиента.
[15.12.2011 13:06:47.213] [00000704] => CreateConnectionToServer
[15.12.2011 13:06:47.213] [00000704] .\network.cpp (567) ServerIp - „192.168.129.39”, ServerPort - 5567
[15.12.2011 13:06:47.213] [00000704] .\network.cpp (581) .\network.cpp (581) - CreateConnectionToServer
[15.12.2011 13:06:47.213] [00000704] .\network.cpp (591) .\network.cpp (591) - CreateConnectionToServer
[15.12.2011 13:07:08.242] [00000704] .\network.cpp (600) Неудалось создать соединение с сервером ( 192.168.129.39:5567 WSAGetLastError код: 10060 )
[15.12.2011 13:07:08.242] [00000704] .\network.cpp (210) Закрытие сетевого соединения
[15.12.2011 13:07:08.242] [00000704] <= CreateConnectionToServer
[15.12.2011 13:07:09.256] [00000704] => CreateConnectionToServer
[15.12.2011 13:07:09.256] [00000704] .\network.cpp (567) ServerIp - „192.168.129.39”, ServerPort - 5567
[15.12.2011 13:07:09.256] [00000704] .\network.cpp (581) .\network.cpp (581) - CreateConnectionToServer
[15.12.2011 13:07:09.256] [00000704] .\network.cpp (591) .\network.cpp (591) - CreateConnectionToServer
[15.12.2011 13:07:30.285] [00000704] .\network.cpp (600) Неудалось создать соединение с сервером ( 192.168.129.39:5567 WSAGetLastError код: 10060 )
[15.12.2011 13:07:30.285] [00000704] .\network.cpp (210) Закрытие сетевого соединения
[15.12.2011 13:07:30.285] [00000704] <= CreateConnectionToServer
На сервере
LOG_CONSOLE(CONS_COLOR_RED, tempstr.c_str());
LOG_CONSOLE(CONS_COLOR_RED, "\nm_Port: %d\n", m_Port);
сразу после бинда из предыдущего кода выдал
192.168.129.39
m_Port: 5567
2) ZeroMemory сделал, без эффекта
3) сча попробуем (shall/will — главное чтоб работало)
Здравствуйте, WhiteDove, Вы писали:
WD>Здравствуйте, savitar, Вы писали:
S>>Здравствуйте, WhiteDove, Вы писали:
S>>1. покажи m_Host
S>>2. обнуляй local_addr
S>>3. правильно ::socket( PF_INET, к данной проблеме это отношения не имеет, но..
WD>1) Содержимое лога клиента.
WD>WD>[15.12.2011 13:06:47.213] [00000704] => CreateConnectionToServer
WD>[15.12.2011 13:06:47.213] [00000704] .\network.cpp (567) ServerIp - „192.168.129.39”, ServerPort - 5567
WD>[15.12.2011 13:06:47.213] [00000704] .\network.cpp (581) .\network.cpp (581) - CreateConnectionToServer
WD>[15.12.2011 13:06:47.213] [00000704] .\network.cpp (591) .\network.cpp (591) - CreateConnectionToServer
WD>[15.12.2011 13:07:08.242] [00000704] .\network.cpp (600) Неудалось создать соединение с сервером ( 192.168.129.39:5567 WSAGetLastError код: 10060 )
WD>[15.12.2011 13:07:08.242] [00000704] .\network.cpp (210) Закрытие сетевого соединения
WD>[15.12.2011 13:07:08.242] [00000704] <= CreateConnectionToServer
WD>[15.12.2011 13:07:09.256] [00000704] => CreateConnectionToServer
WD>[15.12.2011 13:07:09.256] [00000704] .\network.cpp (567) ServerIp - „192.168.129.39”, ServerPort - 5567
WD>[15.12.2011 13:07:09.256] [00000704] .\network.cpp (581) .\network.cpp (581) - CreateConnectionToServer
WD>[15.12.2011 13:07:09.256] [00000704] .\network.cpp (591) .\network.cpp (591) - CreateConnectionToServer
WD>[15.12.2011 13:07:30.285] [00000704] .\network.cpp (600) Неудалось создать соединение с сервером ( 192.168.129.39:5567 WSAGetLastError код: 10060 )
WD>[15.12.2011 13:07:30.285] [00000704] .\network.cpp (210) Закрытие сетевого соединения
WD>[15.12.2011 13:07:30.285] [00000704] <= CreateConnectionToServer
WD>
WD>На сервере
WD>WD> LOG_CONSOLE(CONS_COLOR_RED, tempstr.c_str());
WD> LOG_CONSOLE(CONS_COLOR_RED, "\nm_Port: %d\n", m_Port);
WD>
WD>сразу после бинда из предыдущего кода выдал
WD>192.168.129.39
WD>m_Port: 5567
WD>2) ZeroMemory сделал, без эффекта
WD>3) сча попробуем (shall/will — главное чтоб работало)
3) WinSock2.h, line 468:
#define PF_INET AF_INET
4) netstat показывает вполне себе
C:\Users\admin>netstat -a
Активные подключения
Имя Локальный адрес Внешний адрес Состояние
TCP 0.0.0.0:135 m-portnoy-virt:0 LISTENING
...
TCP 192.168.129.39:5567 m-portnoy-virt:0 LISTENING
Здравствуйте, WhiteDove, Вы писали:
WD>Здравствуйте, WhiteDove, Вы писали:
WD>>Здравствуйте, savitar, Вы писали:
S>>>Здравствуйте, WhiteDove, Вы писали:
S>>>1. покажи m_Host
S>>>2. обнуляй local_addr
S>>>3. правильно ::socket( PF_INET, к данной проблеме это отношения не имеет, но..
WD>>1) Содержимое лога клиента.
WD>>WD>>[15.12.2011 13:06:47.213] [00000704] => CreateConnectionToServer
WD>>[15.12.2011 13:06:47.213] [00000704] .\network.cpp (567) ServerIp - „192.168.129.39”, ServerPort - 5567
WD>>[15.12.2011 13:06:47.213] [00000704] .\network.cpp (581) .\network.cpp (581) - CreateConnectionToServer
WD>>[15.12.2011 13:06:47.213] [00000704] .\network.cpp (591) .\network.cpp (591) - CreateConnectionToServer
WD>>[15.12.2011 13:07:08.242] [00000704] .\network.cpp (600) Неудалось создать соединение с сервером ( 192.168.129.39:5567 WSAGetLastError код: 10060 )
WD>>[15.12.2011 13:07:08.242] [00000704] .\network.cpp (210) Закрытие сетевого соединения
WD>>[15.12.2011 13:07:08.242] [00000704] <= CreateConnectionToServer
WD>>[15.12.2011 13:07:09.256] [00000704] => CreateConnectionToServer
WD>>[15.12.2011 13:07:09.256] [00000704] .\network.cpp (567) ServerIp - „192.168.129.39”, ServerPort - 5567
WD>>[15.12.2011 13:07:09.256] [00000704] .\network.cpp (581) .\network.cpp (581) - CreateConnectionToServer
WD>>[15.12.2011 13:07:09.256] [00000704] .\network.cpp (591) .\network.cpp (591) - CreateConnectionToServer
WD>>[15.12.2011 13:07:30.285] [00000704] .\network.cpp (600) Неудалось создать соединение с сервером ( 192.168.129.39:5567 WSAGetLastError код: 10060 )
WD>>[15.12.2011 13:07:30.285] [00000704] .\network.cpp (210) Закрытие сетевого соединения
WD>>[15.12.2011 13:07:30.285] [00000704] <= CreateConnectionToServer
WD>>
WD>>На сервере
WD>>WD>> LOG_CONSOLE(CONS_COLOR_RED, tempstr.c_str());
WD>> LOG_CONSOLE(CONS_COLOR_RED, "\nm_Port: %d\n", m_Port);
WD>>
WD>>сразу после бинда из предыдущего кода выдал
WD>>192.168.129.39
WD>>m_Port: 5567
WD>>2) ZeroMemory сделал, без эффекта
WD>>3) сча попробуем (shall/will — главное чтоб работало)
WD>3) WinSock2.h, line 468:
WD>#define PF_INET AF_INET
WD>4) netstat показывает вполне себе
WD>WD>C:\Users\admin>netstat -a
WD>Активные подключения
WD> Имя Локальный адрес Внешний адрес Состояние
WD> TCP 0.0.0.0:135 m-portnoy-virt:0 LISTENING
WD>...
WD> TCP 192.168.129.39:5567 m-portnoy-virt:0 LISTENING
WD>
WD>
Ля. Брандмауэр.
вопрос вроде снят.