Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 名为pipe的窗口不';无法正确响应并发请求_C#_Delphi_Windows Xp_Named Pipes - Fatal编程技术网

C# 名为pipe的窗口不';无法正确响应并发请求

C# 名为pipe的窗口不';无法正确响应并发请求,c#,delphi,windows-xp,named-pipes,C#,Delphi,Windows Xp,Named Pipes,我使用命名管道在一个程序内部进行内部通信(在Windows XP上)。当我连接2-3个客户端时,命名管道可以很好地用于多个连接。但是,当我同时应用多个连接时(例如10),只有少数连接可以被ConnectNamedPipe()接受,通信似乎被阻塞 但当我在客户机代码中调试时,我发现所有客户机CreateFile函数都返回了正确的文件句柄(似乎是正确的)。这是令人困惑的,因为我看了CreateNamedPipe循环,它只创建了大约一半的句柄 服务器部件: while (!isPipeS

我使用命名管道在一个程序内部进行内部通信(在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,其行为也相同):


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

您没有正确使用重叠操作:

如果打开hNamedPipe时文件_FLAG_重叠,则LPU重叠 参数不能为NULL。它必须指向有效的重叠 结构。如果打开hNamedPipe时文件_FLAG_重叠且 lpOverlapped为NULL,函数可能会错误地报告 连接操作已完成

此外,我认为有时您的
ConnectNamedPipe
调用会返回错误,因为客户端尚未连接(错误\u IO\u待定)。在这些情况下,当客户端的连接完成时,客户端将被“孤立”,因为您没有为它们创建
管道线程


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

我不知道为什么投票失败。也许您可以提供有关循环失败的更多详细信息:发生了什么,是否存在异常,是否返回了无效句柄,等等?GetLastError()告诉您什么?谢谢您,正如@Chris所说的,管道没有正确创建。但是函数没有给我任何错误。我猜他们只是一些没有记录的行为。
  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