具有一个通过终端服务/远程桌面服务虚拟通道API进行通信的应用程序。 客户端将随机且定期(大约每20,000条消息)发送一条消息(VirtualChannelWrite返回0,并且使用CHANNEL_EVENT_WRITE_COMPLETE调用VirtualChannelOpenEvent),但服务器调用WTSVirtualChannelRead永远不会读取该消息。 服务器上没有错误消息。 客户端写操作没有时间差异的迹象。

在服务器端,仅从一个线程访问虚拟通道以进行读取和写入,因此这不是线程问题(WTSVirtualChannelRead和WTSVirtualChannelWrite线程不安全)。

任何人都对导致丢失消息的原因有深刻的了解?

我想知道此API是否无法针对高密度的客户端到服务器流量进行扩展(从未见过从服务器到客户端的丢弃消息)。 我想知道,按照MSDN ,服务器上的重叠I / O解决方案是否会更好地执行:“ WTSVirtualChannelQuery返回一个文件句柄,您可以使用该文件句柄执行异步(重叠)读取和写入操作”。

===============>>#1 票数:1 已采纳

WTSVirtualChannelRead和WTSVirtualChannelWrite API是Microsoft设计不良的API之一。

首先,由于异步I / O,您不能从任何线程使用WTSVirtualChannelRead()和WTSVirtualChannelWrite()。 您必须使用WTSVirtualChannelQuery()获取文件句柄,然后通过ReadFile()和WriteFile()对虚拟通道进行读写。

同样,在读取虚拟通道时,您必须处理必须处理ReadFile()立即返回的情况,因为有可用数据并且ReadFile()被阻止,并且您要等到I / O完成后再调用GetOverLappedResult()。

有关更多详细信息,请访问http://blogs.msdn.com/b/rds/archive/2007/09/20/dynamic-virtual-channels.aspx

===============>>#2 票数:1

Angry Coder的答案是正确的,您必须使用Overlapped I / O。 我发现一个解决方案,其细节有所不同:

首先,正如我在问题中提到的那样,只要在同一线程中调用WTSVirtualChannelRead()和WTSVirtualChannelWrite()通常就可以工作。 但是WTSVirtualChannelRead()仍然偶尔会丢失消息。 显然,解决方法是阻塞1秒钟 当您需要写时没有好处,但在读取阻塞时却不能。

其次,我根据本文在.NET中实现了重叠I / O。 使用I / O完成端口,读和写操作始终在回调方法中完成,因此无需区分是否有可用数据。

第三,没有必要实现动态虚拟通道。 根据Virtual Channel Client API ,所有这些都可以在静态通道上正常工作。

  ask by JMH translate from so

未解决问题?本站智能推荐:

1回复

PCI合规性:使用SSL作为RDP(终端服务)的传输层

我的客户未通过她的PCI合规性审核。 该服务器支持远程桌面(终端服务),但仅提供加密而不提供身份验证。 这会使服务器遭受中间人攻击。 假定的解决方案是强制将SSL作为RDP的传输层。 有人知道怎么做吗? 该服务器运行Windows 2003。
1回复

使用远程桌面服务API检索终端服务上的用户LogonTime

请帮助我检查为什么使用远程桌面服务API检索终端服务上的用户LogonTime的代码(由FWN在本主题中编写)为何无法正常工作-每次wtsinfo.LogonTime返回不同的Int64值。 这是修改后的代码: RDPInfo.cs: Program.cs: PS当我想我
1回复

如何从userParameters属性获取Active Directory中的终端服务属性值

我正在使用dirsync来获取Active Directory(更改日志)中已更改的属性值。 以下链接说明了如何使用目录同步来获取属性值: ' http://blogs.technet.com/b/isrpfeplat/archive/2010/09/20/using-the-dirsy
3回复

(如何)可以使用终端服务/远程桌面共享Access数据库?

我以前使用的唯一类型的“远程桌面”应用程序是VNC查看器。 我对这种应用程序的理解是,当多个用户登录同一台VNC服务器时,他们共享键盘,鼠标和桌面,因此只有一个人可以实际使用计算机,而其他用户可以观察正在发生的事情。 这显然有其自己的用途。 我要做的是在远程服务器上提供一个MS Acc
2回复

如何在VB6的终端服务会话中检测是否?

如何在VB6应用程序中检测当前会话是否为终端服务(远程桌面)会话?
1回复

终端服务-:价值不在预期范围内

在应用程序中测试驱动远程桌面功能,但由于输入的服务器名称不断出现奇怪的错误。 码: 不断收到错误: 在线: txtServer.Text输入为(但带有真实地址): 其他人有这个问题吗? 编辑 问题出在地址中的端口,我该如何解决?
1回复

适用于Windows 8 Metro的远程桌面/终端服务API

我很难找到一个API来使用Visual Studio 2012中的RDP来获取地铁风格的应用程序,这是否可用?
1回复

在终端服务器上使用程序期间出现“ Windows正在配置”对话框

在终端服务器环境中,当尝试在软件内执行功能时,Windows将抛出类似于Microsoft Office的“正在配置Windows”对话框,这在终端服务器环境中遇到了一个特别烦人的问题。 我怀疑它可能与程序的安装方式有关,但是甚至使用了http://technet.microsoft.com/
2回复

码头服务

嗨, 我正在使用Delphi,我想制作一个可以执行以下操作的应用程序 从终端服务(远程桌面)中启动时,如果另一个用户登录到另一个终端服务会话,他们应该能够看到桌面托盘中正在运行的应用程序。 但是,如果坐在服务器上的用户登录,那么他们应该看不到桌面托盘中正在运行的应用程序。 如果每
1回复

Windows Server 2012远程桌面服务器应用缓慢的GPO

我有一个远程桌面服务器2012 R2。 我有一个支持环回的GPO和一些设置。 然后我有一些应用的用户可配置的GPO。 他们工作得很好。 但是,我遇到一个特定的GPO问题,该GPO在桌面上应用快捷方式运行.vbs脚本。 在桌面上出现快捷方式之前,我必须等待大约5-10分钟。 我对它有点