Функция HandleAccept(...) не всегда вызывается в режиме отладки. Поэтому прихоится перезупускать сервер и конектится, если присоединился, то далее все работает. Иногда приходится повторять раз 10 и более. Приложение закрыл и все по новой. Если просто запускать, то шансов больше.
static boost::asio::io_service *g_stcpIOService = nullptr;
static boost::thread *g_stcNetServiceThread[64] = {0};
void NetServiceRun()
{
g_stcpIOService->run();
}
void CKernel::InitNetService(INT32 n32ThreadCount)
{
for(INT32 i = 0; i < n32ThreadCount; ++i) {
g_stcNetServiceThread[i] = new boost::thread(&NetServiceRun);
}
}
void CKernel::PrepareForNextAccept()
{
m_shpNewConnecion.reset(new CConnection(*g_stcpIOService));
m_pAcceptor->async_accept(m_shpNewConnecion->GetSocket(),
boost::bind(&CKernel::HandleAccept, this,
boost::asio::placeholders::error));
}
void CKernel::HandleAccept(const boost::system::error_code & ec)
{
if(!m_pAcceptor->is_open()) {
LogPrintDebug("Acceptor Close");
return;
}
if(!ec) {
LogPrintDebug("Handle Accept Succes");
m_ConnectionManager.Start(m_shpNewConnecion);
} else {
LogPrintDebug("Handle Accept Error: %s", ec.message());
}
PrepareForNextAccept();
}
bool CKernel::Initialize()
{
InitNetService(1);
m_pAcceptor = new boost::asio::ip::tcp::acceptor(*g_stcpIOService);
m_pSocket = new boost::asio::ip::tcp::socket(*g_stcpIOService);
boost::asio::ip::tcp::resolver resolver(*g_stcpIOService);
boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve({"127.0.0.1", "1973"});
m_pAcceptor->open(endpoint.protocol());
m_pAcceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
m_pAcceptor->bind(endpoint);
m_pAcceptor->listen();
PrepareForNextAccept();
}
Функция acync_write не выдает ошибки. при отправке если сервер не вызывает HandleAccept
async_write(m_Socket, boost::asio::buffer(buffer,size),[this](boost::system::error_code ec, std::size_t length)
{
if(!ec)
{
std::cout << "async_write ok " << std::endl;
DoReadHeader();
}
});
Если вызвать netstat при этом.
cucaracha@cucaracha-Lenovo-B50-30:~$ netstat | grep 1973
tcp 0 0 localhost:58642 localhost:1973 ESTABLISHED
tcp 20 0 localhost:1973 localhost:58642 ESTABLISHED
cucaracha@cucaracha-Lenovo-B50-30:~$ netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:63342 *:* LISTEN
tcp 0 0 localhost:1973 *:* LISTEN
...
Полный код github
Возможно, проблема в следующем: у вас задача запускается так:
io_serviceНо у io_service есть одна особенность: цикл событий крутится только до тех пор, пока в нём есть задачи. Т.е. если после создания потоков они сразу запустятся, до того, как главный поток добавит в очередь задание на ожидание подключения, потоки просто завершатся, т.к. в очереди еще нет задач.
Способа решения два - либо создавать потоки после того, как будет вызвано ожидание подключения, либо до создания потоков создавать объект io_service::work, который не позволит завершиться потокам до того, как экземпляр io_service::work будет уничтожен.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей