获取使用 C# 连接到命名管道服务器的客户端的进程 ID

Posted

技术标签:

【中文标题】获取使用 C# 连接到命名管道服务器的客户端的进程 ID【英文标题】:Get process ID of a client that connected to a named pipe server with C# 【发布时间】:2013-04-09 07:53:50 【问题描述】:

我不确定我只是没有看到它,还是什么?我需要知道通过命名管道从NamedPipeServerStream 实例连接到我的服务器的客户端的进程ID。这可能吗?

同时我想出了这个功能:

[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool GetNamedPipeClientProcessId(IntPtr Pipe, out UInt32 ClientProcessId);
public static UInt32 getNamedPipeClientProcID(NamedPipeServerStream pipeServer)

    //RETURN:
    //      = Client process ID that connected via the named pipe to this server, or
    //      = 0 if error
    UInt32 nProcID = 0;
    try
    
        IntPtr hPipe = pipeServer.SafePipeHandle.DangerousGetHandle();
        GetNamedPipeClientProcessId(hPipe, out nProcID);
    
    catch
    
        //Error
        nProcID = 0;
    

    return nProcID;

我对“DangerousGetHandles”和“DllImports”不是很擅长。我在这里使用的 Win32 更好。

【问题讨论】:

您的问题/问题实际上是什么? 你想知道“这对吗”?还是什么? 我主要关心的是他们所谓的“DangerousGetHandle”。 您使用DangerousGetHandle没有问题。 【参考方案1】:

该代码的主要问题是它没有执行正确的错误处理。您需要检查GetNamedPipeClientProcessId 的返回值来检测错误。

[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool GetNamedPipeClientProcessId(IntPtr Pipe, out uint ClientProcessId);
public static uint getNamedPipeClientProcID(NamedPipeServerStream pipeServer)

    UInt32 nProcID;
    IntPtr hPipe = pipeServer.SafePipeHandle.DangerousGetHandle();
    if (GetNamedPipeClientProcessId(hPipe, out nProcID))
        return nProcID;
    return 0;

【讨论】:

谢谢。但我认为这有点多余,因为我一开始就将nProcID 设置为 0。 好吧,编译器应该已经警告你在try之前的赋值中分配给nProcID的值从未被使用过。无论如何,Win32 函数不会发出异常信号。它们通过返回值发出错误信号。

以上是关于获取使用 C# 连接到命名管道服务器的客户端的进程 ID的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信:MFC 服务器、.NET C# 客户端

UWP C# 管道客户端无法连接到 Win32 C++ 管道服务器

我可以拥有多少个命名管道?

可以连接到命名管道的客户端数量

C/S模型之命名管道

c#命名管道双向通信