繁体   English   中英

Windows命名管道无法正确响应并发请求

[英]Windows named pipe doesn't respond correctly for concurrent requests

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

我能知道我想念什么吗? 谢谢!

您没有正确使用重叠操作。 特别是

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

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

如果要使用重叠模式,则应进行更多研究并正确实施它。 另外,如果您从CreateNamedPipe的参数中删除FILE_FLAG_OVERLAPPED,则ConnectNamedPipe将阻塞,直到客户端连接为止,并且不会发生此问题,尽管您将遇到另一个问题:如何在停止服务器时取消阻塞(您可以可以在IIRC上找到一些答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM