ログイン

2016年3月 弊社ホームページは新しくなりました。 https://thinkridge.com

メインメニュー

携帯公式サイト


携帯電話をもっと便利に
もっと楽しく


史上初の吹奏楽専門着メロサイト


POPで癒しでライトでとんがって気持ちのいい〜オルゴール着メロをあなたに

Magome

クラウドベースの MIDI シーケンサ Magome

音楽制作に興味のある方を対象に、スタンドアロンでも使え、ネットならではの面白さも兼ね備えた音楽制作アプリの提供を目指しています

for 携帯電話

https://thinkridge.com/m/
ケータイはこちらへ

2013年6月15日(土曜日)

boost::asio ソケットを別プロセスに渡す

カテゴリー: - takatsuka @ 10時11分29秒

久しぶりに 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

このコメントのRSS

TrackBack URL : http://www.thinkridge.com/modules/wordpress/wp-trackback.php/125

この投稿には、まだコメントが付いていません

コメント

_CM_NOTICE

32 queries. 0.031 sec.
Powered by WordPress Module based on WordPress ME & WordPress

カレンダー
2013年 6月
« 5月   7月 »
 1
2345678
9101112131415
16171819202122
23242526272829
30  
月別過去ログ
カテゴリ一覧
検索
最近の投稿
最近のコメント
投稿者ブロック