gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:56 25 4
gpt4 key购买 nike

我在一个程序(在 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

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

最佳答案

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

If hNamedPipe was opened with FILE_FLAG_OVERLAPPED, the lpOverlapped parameter must not be NULL. It must point to a valid OVERLAPPED structure. If hNamedPipe was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL, the function can incorrectly report that the connect operation is complete.

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

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

关于c# - Windows 命名管道无法正确响应并发请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17057739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com