named pipe

Named Pipes - Windows applications | Microsoft Docs
http://www.codeproject.com/threads/Win32IPC.asp
サーバとクライアント。サーバはCreateNamedPipeしてConnectNamedPipeでクライアントからの接続を待つ。CreateのときPIPE_(NO)WAITフラグでブロッキングモードの設定。

If the specified pipe handle is in nonblocking mode, ConnectNamedPipe always returns immediately. In nonblocking mode, ConnectNamedPipe returns a nonzero value the first time it is called for a pipe instance that is disconnected from a previous client. This indicates that the pipe is now available to be connected to a new client process. In all other situations when the pipe handle is in nonblocking mode, ConnectNamedPipe returns zero. In these situations, GetLastError returns ERROR_PIPE_LISTENING if no client is connected, ERROR_PIPE_CONNECTED if a client is connected, and ERROR_NO_DATA if a previous client has closed its pipe handle but the server has not disconnected. Note that a good connection between client and server exists only after the ERROR_PIPE_CONNECTED error is received.

http://msdn2.microsoft.com/en-us/library/aa365146.aspx

ノンブロッッキングモードにおいてConnectNamedPipeはウエイトせずすぐ返る。クライアントから切断されたパイプを引数にして最初に呼んだ時は非零が返り、これはこのパイプが使用可能になったことを示す。それ以外のケースでは零が返り、GetLastErrorの値によりそれぞれ:

ERROR_PIPE_LISTENING
クライアントからのコネクションがない場合
ERROR_PIPE_CONNECTED
クライアントとの接続が確立した場合(エラーで返すって。どんなインターフェースだよ)
ERROR_NO_DATA
クライアントから切断されたがサーバ側で切断処理してない場合

で、ERROR_PIPE_CONNECTEDが返ればそのパイプは正常に接続された。
ちなみにノンブロッキングモードにおいてもインターフェースが変。どうしてこんな設計になったんでしょうね。

Named Pipe Client - Windows applications | Microsoft Docs
クライアント側ではCreateFileでパイプを開く。ブロックしたいときはWaitNamedPipeを併用。あとはRead/WriteFile

さて、今回の使用目的だが、巨大なアプリと小規模なアプリの間で通信がしたい。小規模なアプリがセンサの値を読んで適宜巨大アプリに投げる。巨大アプリはメインループ内で値を読み、それによって挙動を変える。ただし、値が来ない場合もある。その場合も遅延なく、デフォルト動作すること。どっちをサーバにするべきかな。
巨大アプリのほうをサーバにする場合、ノンブロッキングモードでパイプ作成@メインループ外→ループ内でたまにConnectNamedPipe、つながったら値を見てなんかする。小規模アプリ側はNamedPipeを開けるまでウェイトして再試行→適当にデータ投げる。データ投げるタイミングはどうしよう?あと送信したデータがひとつながりで受信される保障があるんだろうか?つまり123345が送信されたとき受信側で123と45に分離しないのか?
巨大アプリをクライアントにする場合、メインループ内でNamedPipeを開く(ノンブロッキングで)、開けたら値読んでなんかする。小規模アプリはサーバ動作して接続が来たら以下略。
特徴:巨大アプリは起動がかなり遅いので常時起動しっぱなしで。小規模アプリは起動したりしなかったりする。原則として小規模アプリは一度起動したら巨大アプリの生存期間には終了しない。がすることもたまにあるので、その際にひどいエラーを出して巨大アプリが落ちることはないようにすること。小規模アプリはそもそも起動しないこともある。巨大アプリの起動前からいることもある。起動中にあらわれることもある。どのケースでも、ひどく遅くならないようにすること。