0

独立したログ ビューアーと、名前付きパイプ経由でメッセージを送信するための C++ ライブラリで構成されるログ機能 (SS_Log の子孫) があります。

ログ ビューアは、最初のメッセージがログに記録されるときに、C++ ライブラリを介してクライアントによって起動されます。

HANDLE hPipe = CreateNamedPipe( szPipeName,
                                PIPE_ACCESS_DUPLEX, 
                                PIPE_TYPE_MESSAGE|PIPE_WAIT|PIPE_READMODE_MESSAGE, 
                                PIPE_UNLIMITED_INSTANCES, 
                                SSLOG_MAX_MESSAGE_LENGTH,
                                0, 5000, &sa );

pView->Pipe(hPipe);

if( pView->Pipe() == INVALID_HANDLE_VALUE )
{
    pView->MessageBox( _T("Could not create the pipe for incoming messages.  No messages can be received.   "), 
        _T("Fatal Error"), MB_OK|MB_ICONSTOP );
    return FALSE;
}

// now we loop forever, waiting for messages.  As they come in, send them
// to the SS_Log_WindowView::EraseLog() and SS_Log_WindowView::WriteLog()
// functions as appropriate.
while( TRUE )
{
    ConnectNamedPipe( pView->Pipe(), NULL );
    ...
}

クライアントがメッセージを送信したい場合、送信します

BOOL bResult = WaitNamedPipe(WindowPipeName(), 20000);
            bResult = CallNamedPipe(WindowPipeName(), (LPVOID)szFinalBuffer, 
                             _tcslen(szFinalBuffer)+1, (LPVOID)NULL, 
                             0, &dwBytesRead, 
                             5000);

この名前付きパイプに対応する HANDLE を取得したいと考えています。ドキュメントは、を使用して作成できることを示唆していCreateFile( WindowPipeName(), GENERIC_READ|GENERIC_WRITE,...OPEN_EXISTING,...)ます。これを行うと、明らかに何かがブロックされ始め、ログ ビューアーはメッセージを受信しなくなります。そして、それはその HANDLE で何もしなくてもです。

私がやりたいことをすることは可能ですか?

4

1 に答える 1

1

ログ ビューアのループは、 への呼び出しで始まりますConnectNamedPipe。したがって、クライアントが接続するのを待ち、メッセージを読み、ループの先頭に戻り、クライアントが再び接続するのを待ちます。

これはCallNamedPipe、その関数がメッセージを送信するたびに接続および切断するため、機能します。

ただし、クライアントがパイプへのハンドルを開いて永続的な接続を作成した場合、CreateFile接続は 1 回だけです。サーバーでは、別のクライアントが接続するのを待って への 2 番目の呼び出しConnectNamedPipeがハングします。

ログ ビューアーが永続的な接続を持つ単一のクライアントのみを処理するようにする場合はConnectNamedPipe、パイプが閉じられるまでクライアントからのメッセージを処理する内部ループが続くループを呼び出すことができます。

複数のクライアントを処理したい場合、現在のソリューションは、複数の同時接続を処理しようとするよりもはるかに簡単です。

于 2013-03-20T17:23:05.107 に答える