切断直後にクライアントを再接続しようとすると、サーバー側 (fork() を使用したマルチ プロセス サーバー) で発生するこの例外があります。ブーストを使用していますが、マルチプロセスでのデバッグは私だけのものではないため、例外をスローする正確な命令を今のところ理解していません。
ただし、この時点で次のようになります。
io_service_.notify_fork(boost::asio::io_service::fork_child);
何か案は?
アップデート
私は1.52バージョンのasioを使用しているため、フォークをサポートしており、例外は子プロセスにあります。3 回目の再接続試行で発生するため、
- クライアントを接続する
- 切断 (ctrl +c で強制)
- 再接続 (すべて動作)
- 切断する
- このクライアント (または別のクライアント) に再接続すると、例外がスローされます。
これはコードです:
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();
}