1 つのプログラム内の内部通信に名前付きパイプを使用しました (Windows XP 上)。名前付きパイプは、2 ~ 3 台のクライアントを接続したときに、複数の接続に対して正常に機能します。ただし、複数の接続 (たとえば 10) を同時に適用すると、詰まっているように見えます。ConnectNamedPipe() によって受け入れられる接続はごくわずかで、通信が詰まっているようです。
しかし、クライアント コードでデバッグしたところ、すべてのクライアント CreateFile 関数がファイル ハンドルと共に正しく返されることがわかりました (正しいもののようです)。CreateNamedPipe ループを見て、ハンドルの約半分しか作成しないので、混乱します...
サーバー部分:
while (!isPipeServerClosed)
{
try
{
filehandle = CreateNamedPipe(
this.pipeName,
DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE,
255,
InBufferSize,
InBufferSize,
0,
IntPtr.Zero);
if (ConnectNamedPipe(filehandle, IntPtr.Zero) > 0)
{
PipeThread pipe = new PipeThread(filehandle);
sPipeThreadList.Add(pipe);
}
}
catch (Exception exp)
{
System.Console.WriteLine(exp.StackTrace);
}
}
クライアント部分、単純な Delphi コード ( WaitNamedPipe で試しても同じように動作します):
FHandle := INVALID_HANDLE_VALUE;
FHandle := CreateFile(PChar(FPipeName),GENERIC_READ or GENERIC_WRITE,
0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
// create the class
if FHandle = INVALID_HANDLE_VALUE then
begin
Connected := false;
end
私は何を逃したかを知ることができますか?ありがとうございました!