获取使用 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的主要内容,如果未能解决你的问题,请参考以下文章