boost::asio ソケットを別プロセスに渡す
久しぶりに boost::asio ネタです。
サーバーで、acceptしたソケットを、別のプロセスに渡したい場合があると思います。
そのあたり boost::asio では簡単にできるんだろうか?と思い、ソースを眺めたり、Examples 見たりしたけど、そのものズバリっぽいものが見当たらない。
Examples には fork の項に近いのがあったんですが、fork() とか使ってるとこからして windows 向けではなさげだし・・・、
というわけで、今回のネタも windows 向けです。
サーバーを windows でってのがそもそも・・・という意見もありそうですが、windows でも P2P アプリを作りたいとか、ちょっとは需要あると思うんです。
というわけで、boost::asio で、accept したソケットを別のプロセスに渡す方法ですが、
結局、boost::asio だけで閉じることは出来ず win32 api を使ってます。
やることは、
複製元のソケットで、
boost::asio::ip::tcp::socket socket;
・・・
WSAPROTOCOL_INFO pi = {0,};
::WSADuplicateSocket( socket.native(), ::GetCurrentProcessId(), &pi);
SOCKET h = ::WSASocket( pi.iAddressFamily, pi.iSocketType,pi.iProtocol, &pi, 0, 0 );
socket.close();
ってハンドルをこさえて、複製先の子プロセスでは、
socket.assign( boost::asio::ip::tcp::v4(), h );
とやることで実現してます。
注意点としては、
#define BOOST_ASIO_DISABLE_IOCP 1
を入れることなんですが、これを入れることのデメリットがよくわからずにやってます。
こさえたサンプルアプリのソース一式を置いておきますので、必要な方は見てみてください。そしてダメ出しとかお願いします。
クライアント側がないと動作が見にくいという場合、boost::asio 使ったチャットソフトが同じところにありますので、そちらも参照下さい。
http://www.thinkridge.com/modules/mydownloads/
そういえば、いつのまにか boostpro サイト が終了してたんですね。
インストーラーは便利だっただけにとても残念です。
運営の方、お疲れ様でござました。感謝です。
TrackBacks
TrackBack URL : http://www.thinkridge.com/modules/wordpress/wp-trackback.php/125
この投稿には、まだコメントが付いていません