気付いている方はいると思いますが、MessaagePack-RPC for C++(今後、単にMsgPack-RPCと略す)のWindowsへの移植をやっています。それも、下位層をMPIOから自前のもの(IO完了ポート(以下IOCPと略す)を使いたいがため)にすげ替える形でやろうとしています。なので、しばらくこれに関することも時々書きます。

今日はソケット周りの細かいことを1つ取り上げます。

MsgPack-RPC + MPIOの場合、on_connectやon_acceptで(引数として)生のソケットを受け取って、それら関数内でloopオブジェクトとの関連付け(add_handler関数呼び出し)を行います(参照: transport/tcp.cc)。しかし、IOCPではそれだと時期的に遅い場合があります。

IOCPの場合、「loopオブジェクトとの関連付け」の具体的な作業は、ソケットとloopオブジェクトが保持するIOCPハンドルを実引数にしてCreateIoCompletionPort関数を呼ぶことです。たとえば、ConnectExでIOCP使ったconnect処理を実装しようものなら、当然ConnectExより先にCreateIoCompletionPortを呼んでおく必要があります。そのため、on_connectに処理が来るときにはもう関連付けが終わっている、——つまり遅い——というわけです。

まとめに入ると、IOCP版のon_connectやon_acceptには、loopオブジェクトと関連付けを確立した状態のソケットが渡されるようにするほかありません。その影響として、MsgPack-RPC + MPIOで行われていたようなadd_handler関数呼び出しも消えることでしょう。


スポンサード リンク

この記事のカテゴリ

  • ⇒ MPIOとIO完了ポートのソケット