У меня есть это исключение, которое происходит на стороне сервера (многопроцессорный сервер с fork ()), когда я пытаюсь переподключить клиента сразу после отключения. Я использую boost, но в настоящее время я не совсем понимаю инструкцию, которая выдает исключение, потому что отладка в многопроцессорном режиме не просто для меня.
Однако я полагаю, что на данный момент:
io_service_.notify_fork(boost::asio::io_service::fork_child);
Есть идеи?
Обновление
Я использую версию 1.52 asio, поэтому она поддерживает форк, и исключение находится в дочернем процессе. Это происходит при третьей попытке переподключения, поэтому, если
- Подключить клиента
- Отключить (принудительно, нажав Ctrl + C)
- Переподключение (все работы)
- Disconnect
- Повторное подключение этого клиента (или другого клиента) вызывает исключение ..
Это код:
if (fork() == 0) //I'm child process
{
io_service_.notify_fork(boost::asio::io_service::fork_prepare);
cout << "I'm child process and my PID is " << getpid() << endl;
/*Notifies to the io_service_ the fork termination*/
try
{
io_service_.notify_fork(boost::asio::io_service::fork_child);
}
catch (boost::exception& e)
{ cout<<"Exception in notify_fork child "<< endl;
std::cerr << diagnostic_information(e) << std::endl;
}
/*Closes the listen socket which remains opened in the parent process to accept new connections*/
acceptor_.close();
}
else //I'm the parent process
{
cout << "I'm the parent process and my PID is " << getpid() << endl;
/*Notifies to the io_service_ the fork termination*/
try
{
io_service_.notify_fork(boost::asio::io_service::fork_parent);
}
catch (boost::exception& e)
{
cout<<"Exception in notify_fork parent "<< endl;
std::cerr << diagnostic_information(e) << std::endl;
}
socket_.close();
/*Listening to new connections*/
start_accept();
}