Windows命名管道对并发请求没有正确响应

时间:2013-06-12 04:36:01

标签: c# delphi windows-xp named-pipes

我在一个程序中使用命名管道进行内部通信(在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

我能知道我错过了什么吗?谢谢!

1 个答案:

答案 0 :(得分:1)

您没有正确使用重叠操作。 In particular

  

如果使用FILE_FLAG_OVERLAPPED打开hNamedPipe,则lpOverlapped   参数不能为NULL。它必须指向有效的OVERLAPPED   结构体。如果使用FILE_FLAG_OVERLAPPED打开hNamedPipe并且   lpOverlapped为NULL,该函数可能会错误地报告该   连接操作完成。

另外,我想有时您的ConnectNamedPipe调用将返回错误,因为客户端尚未连接(ERROR_IO_PENDING)。在这些情况下,您的客户在完成连接时会“孤立”,因为您不会为他们创建PipeThread

如果您想使用重叠模式,您应该做更多的研究并正确实施。或者,如果从CreateNamedPipe的参数中删除FILE_FLAG_OVERLAPPED,则ConnectNamedPipe将阻塞,直到客户端已连接并且不会发生此问题,但您将遇到另一个问题:如何在要停止服务器时取消阻止(您'我会在SO,IIRC上找到一些答案。