问题标签 [namedpipeserverstream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - NamedPipeServerStream.BeginWaitForConnection 失败并出现 System.IO.Exception:管道正在关闭
我用 C# 编写了一个简单的异步 NamedPipeStreamServer 进程,其核心是:
我还为它编写了一个简单的客户端。客户端(它不是异步的)只是打开管道然后退出:
如果我启动服务器,然后启动一个客户端或多个客户端,一切似乎都正常。
如果我在没有启动服务器的情况下启动客户端,客户端会挂起 Connect() 调用,直到我启动服务器,但是当我启动服务器时,服务器会在 BeginWaitForConnection( ) 呼叫,说“管道正在关闭。”
我发现其他人在 BeginWaitForConnection() 上有“管道正在关闭”错误,但它们都是由于尝试对同一个 NamedPipeServerStream 实例进行第二次 BeginWaitForConnection() 调用而引起的。这不是这里发生的事情 - 我为每个 BeginWaitForConnection() 调用创建了一个不同的 NamedPipeServerStream 实例,即使我没有,它在第一个 BeginWaitForConnection() 调用上仍然失败。
难道我做错了什么?或者这只是正常的 - 等待服务器启动的命名管道客户端将在服务器的第一个 BeginWaitForConnection() 调用中导致“管道正在关闭”?
我注意到,如果我再试一次 - 即吸收异常并执行另一个 BeginWaitForConnection() - 然后我会为每个等待服务器启动的客户端获得一个这样的异常,但在处理完所有这些之后,此后服务器似乎工作正常。
编辑:这是 HandleConnection 方法,但我认为它甚至不会命中此代码:
system.reactive - 使用响应式扩展从 NamedPipeServerStream 读取
我可以使用以下代码读取 2 个线程通过 NamedPipeClientStreams 发送的消息:
客户:
服务器:
上面是这样调用的:
如果我尝试使用 RX 读取流,我可以读取第一条消息,然后当 HandleClient 方法如下所示时,客户端线程中会出现“管道损坏”错误:
我假设服务器流在读取后关闭。我不确定如何保持流打开并从中读取。我能够找到的代码示例和文档利用了旧的 APM 技术。我想使用 .Net 4.6 和 RX 库提供的最新/推荐技术。在我的应用程序中,客户端将在很长一段时间内随意发送消息。所以我希望管道保持每个客户端打开,以免每条消息都产生连接开销。
我也将不胜感激有关边缘情况的任何指导,以便我最终得到一个坚如磐石的解决方案。
c# - 命名管道:启动应用后第一次数据传输很慢
我有一个客户端和一个服务器应用程序,并希望通过命名管道将序列化的小对象从客户端发送到服务器。除了第一次传输之外,它运行良好:每次启动应用程序后最多需要两秒钟。以下转移几乎是即时的。
这是我的服务器代码:
这是客户:
正在传输的数据是一种对时间高度敏感的证券交易所订单,所以对我来说,第一笔订单也必须毫不拖延地工作。
有没有其他方法可以使命名管道的第一次使用与其他命名管道一样快?某种预编译?
我真的想避免额外的线程检查是否可以建立连接并每 x 秒发送一次虚拟数据只是为了“预热”导致延迟的相应对象。
(顺便说一句:代码不是我的,我是从这里得到的!)
c# - 尝试获取客户端进程可执行路径时访问被拒绝错误
我正在开发作为 Windows 服务托管的 WCF 服务,该服务使用命名管道 - NamedPipeServerStream(用户权限)在服务器和客户端进程之间建立安全连接。为了检查客户端进程的真实性,我需要验证客户端进程可执行文件的数字签名,因此我试图通过使用其进程 ID 获取客户端的可执行路径。
我使用Windows 7 Professional SP1(64 位)操作系统和Visual Studio 2015 社区版进行开发。服务器(Windows 服务)和客户端进程(其他 exe)都仅在Release x64模式下构建。
当某些客户端进程连接到服务器时,我试图获取客户端进程 exe 路径,但它在以下代码行中引发“访问被拒绝”错误:
return Process.GetProcessById(processId).MainModule.FileName;
因此,为了解决这个问题,我四处搜索并尝试了如下所述的其他一些实验性试验,但似乎也没有奏效。
实验性试验
- 尝试获取具有查询访问权限的客户端进程句柄但失败 -> 始终返回 0 和最后一个 Win32 错误为 5(访问被拒绝)
OpenProcess(ProcessAccessFlags.PROCESS_QUERY_INFORMATION, false, processId);
- 试图以有限的查询访问权限获取客户端进程句柄但失败->始终返回 0,最后一个 Win32 错误为 5(访问被拒绝)
OpenProcess(ProcessAccessFlags.PROCESS_QUERY_LIMITED_INFORMATION, false, processId);
- 设置 SeDebugPrivilege 并继续获取具有有限查询权限但失败的客户端进程句柄 - > SeDebugPrivilege 已启用,但仍为进程句柄返回 0,最后一个 Win32 错误为 5 ( Access Denied )。
- 尝试使用 app.manifest 文件(requireAdministrator 属性)为 Windows 服务设置管理员权限但失败-->拒绝访问
- 尝试使用 ManagementObject 获取进程信息属性但失败 -> 对象引用未设置为对象的实例
- 将 Windows 服务的登录帐户从“本地服务”更改为“本地系统”但失败
但是,我在示例 Windows 控制台应用程序中尝试了上述所有方法,该应用程序运行良好,没有任何错误,并且在 Windows 服务中也不起作用。我也尝试将控制台应用程序转换为 dll 并在服务器中引用它以获取客户端进程信息但失败 - >再次访问被拒绝
我完全不知道发生了什么以及如何解决它。你的建议真的很有帮助。
编辑:请找到 OpenProcess 和 ProcessAccessFlags 的代码片段,如下所示:
NativeMethods.cs
c# - 所有实例管道都忙 - c# NamedPipeServerStream
我试图在winforms应用程序背景上通过.net v4.0使用管道
这是我的代码-->
试图理解为什么异常“所有实例管道都忙”的想法可能是因为
,但抛出异常:“使用(NamedPipeServerStream pipeserver = new NamedPipeServerStream(“colors”,PipeDirection.Out,4))”命令
ty for helpers sKY Walker
c# - 可以在异步命名管道上执行同步读/写操作吗?
我的期望是这种情况,在使用 PipeOptions.Asynchronous(以及客户端)创建 NamedPipeServerStream 之后,仍然可以在管道上执行同步读/写操作。
但是,我发现当服务器同步写入超出输出缓冲区大小的字节时,客户端会阻塞读取,永远不会返回,即使服务器已经写入了适当数量的数据来满足读取。
更新:我还不能制作一个简单的重现案例,但我已经从 PipeStream 类中分离出我认为可疑的结果。我有以下代码:
这段代码是在管道的另一端已经写入了66754字节的数据,而读取端还没有读到这个数据的情况下执行的(注意,两端管道的in和out max buffersize为65536, 65536 + 1218 == 66754)。
当这段代码执行时,第一次读取返回 n1 == 65536,表明没有读取到我预期的所有数据,所以我执行另一次读取,询问剩余的数据。这个读取无限期地阻塞,永远不会返回。
然而,在第二次读取之前,当我检查缓冲区时,我看到了预期的写入数据,即使在 65535 位置之后!
似乎第一次读取读取了所有数据,但只返回了最大缓冲区大小,所以第二次读取挂起,因为没有更多数据要读取。但是,我不知道,因为我被错误地告知第一次读取时读取的数据量。
现在,对这段代码稍作修改。这段新代码在与之前完全相同的条件下运行。
请注意,现在第一次读取请求仅读取最大缓冲区大小 65536。在这种情况下,n1 == 65536,当第二次读取发生时,它成功返回 n2 == 1218。
在这里,不是第一次读取要求所有数据,而是要求最大缓冲区大小。这些是读取的预期正确结果。
这表明 PipeStream 代码中存在错误,它从 Read 返回了不正确的值。
我将继续尝试为此制作一个简单的复制案例。
另一个更新:发现这个: NamedPipe 的 ReadByte 挂起 似乎与我的问题有关。
c# - 使用 NamedPipe 发送的序列化对象不起作用
我正在尝试将序列化对象(使用XMLSerializer
)NamedPipe
从服务器进程(.NET 应用程序 exe)发送到客户端进程(.NET 应用程序 exe),反之亦然。
顺序是:
1)服务器应用程序使用打开Exe1 Process.Start(processinfo)
,然后启动服务器管道:
在 Exe1 in Form_Load
event 中,客户端应用程序连接到服务器:
然后我在ClientConnected
这里处理事件:
当Timer1
触发 Elapsed 事件时,我使用以下方法将序列化对象发送到服务器 exe:
现在我遇到的问题是这一行ser.Serialize(client, message)
完全挂起,编译器根本没有移动到下一行。这使服务器应用程序永远等待客户端请求。
在服务器端,我调用了这个方法(在客户端上.Serialize()
线后从 button1_click() 调用:
我做错了什么?NamedPipe 是在进程之间发送序列化对象的错误选择吗?
我的系统目标是拥有 1 个服务器应用程序,它本身将产生多个客户端进程。目标是让服务器应用程序从所有打开的客户端进程发送和接收消息。
c# - 命名管道流示例未显示结果
我是管道流的新手并尝试练习。我已经编写了以下两个项目,但我无法从客户端项目中看到结果(我在服务器项目中编写的)。这是第一个项目:
这是第二个项目:
这有什么问题?
谢谢
mono - 为什么在 Mono 上连接 NamedPipeClientStream 而不启动服务器?
我正在尝试使用 NamedPipe。我创建了两个基于控制台的应用程序。一个用于客户端,另一个用于服务器。
客户代码:
服务器代码:
客户型号:
因此,当我在 Mono 上运行此应用程序时,它无需启动服务器即可连接。但同样的代码在 windows .Net Framework 4.7 上也能完美运行。有人知道为什么会在 Mono 上发生这种情况吗?
c# - “已超出服务器实例的最大数量”是什么意思?
System.IO.Pipes.NamedPipeServerStream 类抛出 IOException 并且文档说The maximum number of server instances has been exceeded。这个消息对我来说不是很清楚。有人可以用我能理解的方式解释吗?这是否意味着相同的代码正在由两个不同的进程或类似的东西执行?如果它很少发生,我该如何避免它?
我正在使用以下构造函数:
我得到 IOException。