2

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

私は何を逃したかを知ることができますか?ありがとうございました!

4

1 に答える 1

1

オーバーラップ操作を正しく使用していません。特に:

hNamedPipe が FILE_FLAG_OVERLAPPED で開かれた場合、lpOverlapped パラメーターは NULL であってはなりません。有効な OVERLAPPED 構造を指している必要があります。hNamedPipe が FILE_FLAG_OVERLAPPED で開かれ、lpOverlapped が NULL である場合、関数は接続操作が完了したことを誤って報告する可能性があります。

また、ConnectNamedPipeクライアントがまだ接続されていないため (ERROR_IO_PENDING)、呼び出しでエラーが返されることもあると思います。このような場合、接続が完了すると、クライアントは「孤立」します。これは、クライアント用の を作成していないためですPipeThread

オーバーラップ モードを使用する場合は、もう少し検討して適切に実装する必要があります。または、CreateNamedPipe への引数から FILE_FLAG_OVERLAPPED を削除すると、ConnectNamedPipe はクライアントが接続されるまでブロックされ、この問題は発生しませんが、別の問題が発生します: サーバーを停止したいときにブロックを解除する方法 (ここSO、IIRCでそれに対するいくつかの答えを見つけるでしょう)。

于 2013-06-12T14:05:07.153 に答える