使用Named Pipe Wrapper如何判断客户端连接是否成功?
如何判断Named Pipe Wrapper客户端是否成功连接?
问题背景
使用Named Pipe Wrapper实现客户端-服务器命名管道系统,代码如下:
if (npClient == null) npClient = new NamedPipeClient<NamedPipeExchangeClass>(CConstants.NAMEDPIPE_NAME); npClient.Start(); npClient.Error += NpClient_Error; npClient.Disconnected += NpClient_Disconnected; npClient.ServerMessage += NpClient_ServerMessage; npClient.WaitForConnection(3000);
遇到的问题:
- 调用
WaitForConnection(3000)后无法直接判断是否连接成功,停止服务器后客户端不触发任何错误 - 库没有提供指示连接状态的成员,相关函数均为
void类型,无返回值 - 用互斥量检测服务器存在的方案不可靠,服务器存在不代表连接成功,向不存在的服务器发消息也不会触发错误
编辑补充:发现客户端连接成功时,服务器会发送一条空消息,可结合定时器检测连接,但仍认为超时后无法直接判断连接状态的设计不合理。
可行解决方案
1. 基于服务器确认消息标记连接状态
利用你发现的“连接成功时服务器发送空消息”的特性,通过布尔变量标记连接状态:
bool isConnected = false; // 订阅服务器消息回调,捕获连接确认的空消息 npClient.ServerMessage += (sender, message) => { // 根据实际的消息结构判断空消息 if (message == null || string.IsNullOrEmpty(message.Content)) { isConnected = true; } }; npClient.Start(); npClient.WaitForConnection(3000); // 超时后检查连接状态 if (isConnected) { // 执行连接成功后的逻辑 } else { // 处理连接失败或超时的情况 }
同时在错误和断开回调中更新状态,避免状态失效:
npClient.Error += (sender, e) => isConnected = false; npClient.Disconnected += (sender, e) => isConnected = false;
2. 改用.NET原生NamedPipeClientStream
如果觉得第三方库的设计不符合需求,可以直接使用.NET原生API,它的WaitForConnection会在超时或失败时抛出异常,能直接判断结果:
using (var pipeClient = new NamedPipeClientStream( ".", CConstants.NAMEDPIPE_NAME, PipeDirection.InOut, PipeOptions.None)) { try { pipeClient.WaitForConnection(TimeSpan.FromMilliseconds(3000)); // 连接成功,后续逻辑 } catch (TimeoutException) { // 超时未连接上服务器 } catch (IOException) { // 服务器不存在或连接过程中出错 } }
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

