0

実装しようとしているシンプルなデザインがあります。

単一の C++ ベースのサーバー アプリは、書き込み専用の名前付きパイプを作成します。複数のクライアント (C++ または C#) が読み取り専用として接続し、ステータス メッセージをリッスンします。

これはローカル プロセスで機能していますが、別のホストのクライアントをサーバーに接続できません。

サーバーは XP SP2 (おそらく SP3) で実行されています。クライアントは Win7 で実行されています。

    SECURITY_DESCRIPTOR sd;
    SECURITY_ATTRIBUTES sa;
    SID_IDENTIFIER_AUTHORITY siaWorldSidAuthority = SECURITY_WORLD_SID_AUTHORITY;
    PSID psidWorldSid = (PSID) LocalAlloc  (LPTR, GetSidLengthRequired(1));
    InitializeSid(psidWorldSid, &siaWorldSidAuthority, 1);
    *(GetSidSubAuthority(psidWorldSid, 0)) = SECURITY_WORLD_RID;
    InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorGroup(&sd, psidWorldSid, TRUE);
    ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = &sd;
    sa.bInheritHandle = FALSE;

    HANDLE hPipe = CreateNamedPipe(
        lpszPipename,               // name
        PIPE_ACCESS_OUTBOUND,       // write access 
        PIPE_TYPE_MESSAGE |             // message type pipe 
        PIPE_READMODE_MESSAGE |         // message-read mode 
        PIPE_WAIT,                      // blocking mode 
        PIPE_UNLIMITED_INSTANCES,   // max. instances 
        BUFSIZE,                    // output buffer size 
        BUFSIZE,                    // input buffer size 
        PIPE_TIMEOUT,               // client time-out 
        NULL /*&sa*/);                      // no security attribute

最終パラメーターで NULL を &sa に置き換えても効果はありません。C# クライアント コードは次のようになります。

        SafeFileHandle pipeHandle = 
           CreateFile(
              pipeName,
              GENERIC_READ,
              0,
              IntPtr.Zero,
              OPEN_EXISTING,
              0,
              IntPtr.Zero);

ここで私が見逃している愚かなことは何ですか?

4

1 に答える 1