実装しようとしているシンプルなデザインがあります。
単一の 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);
ここで私が見逃している愚かなことは何ですか?