服务间单向通信的选项

时间:2011-02-14 00:24:59

标签: c++ com windows-services

我正在寻找实现服务与其他服务/应用程序之间通信的不同选项。

我想做什么

我有一个不断运行的服务,轮询连接到串口的设备。在某些点上,此服务应向包含从设备检索的数据的感兴趣的客户端发送消息。数据不复杂,很可能只是一个字符串。

理想情况下,客户端不必订阅接收这些消息,这导致我进行某种事件“广播”设置(类似于Windows事件)。消息发送过程不应该阻止,也不需要任何客户端的响应(或者甚至还有任何客户端)。

我一直在阅读有关IPC(特别是COM)和Windows事件的内容,但我还没有看到一些非常适合我想做的事情。

这可能吗?如果是这样,我应该使用哪些技术?如果没有,有哪些可行的沟通方式?

以下是设置的详细信息:

  • Windows 2000 / XP环境
  • '服务器'服务是使用VC ++ 2005
  • 的Windows服务
  • 客户端会有所不同,但总是在Windows环境中(通常客户端是VC ++ 6 Windows服务,VB6应用程序)

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

Windows支持广播消息,请检查here。您可以从服务SendMessageHWND_BROADCAST,并在每个客户端接收。

答案 1 :(得分:0)

有多种方法可以进行广播系统,但是您必须放弃可靠性(即必须丢失一些消息)使用正确的订阅系统。

如果您愿意放弃可靠性,则可以创建共享内存段并命名为manual-reset事件对象。当新消息到达时,将其写入共享内存段,发出事件对象信号,然后关闭事件对象并创建一个具有不同名称的新对象(名称应位于某处的shmem段中)。客户端打开shmem段,找到当前事件对象,等待它发出信号,然后读取消息和新事件段。

在此选项中,您必须小心处理客户端读取的情况,同时正确更新shmem段。一种方法是在shmem段中有两个序列号字段 - 一个在写入新消息之前更新,一个在之后更新。客户端读取第二序列号之前以读取消息,然后重新读取两个序列号,并检查它们是否相等(并丢弃该消息并在之后重试如果他们不是延迟)。确保对这些序列号的访问设置了内存屏障,以确保编译器不会重新排序它们!

当然,这有点毛茸茸。 Named pipes要简单得多,但需要订阅(一种)。服务器调用CreateNamedPipe,然后接受ConnectNamedPipe的连接。客户端使用CreateFile连接到服务器的管道。然后服务器循环将数据(使用WriteFile)发送到其所有客户端。请注意,每次接受连接时,都需要使用CreateNamedPipe创建管道的附加实例。可以在此处找到命名管道服务器的示例:http://msdn.microsoft.com/en-us/library/aa365588(v=vs.85).aspx