C# 如何以C语言向我的所有应用程序发送一条消息?
我一直在研究使用TCP通过网络发送消息 我目前的情况是,我有一台计算机上运行的单个应用程序的多个实例。我想发送一条TCP消息,让所有应用程序接收该消息并对其执行操作 我所能找到的只是一个发送者和一个接收者的例子。我不想只向网络发送TCP消息,让所有侦听应用程序接收相同的消息 我尝试过使用它,但它似乎也不适用于多个接收器 有没有人能给我指出一个正确的方向,让我找到一个我在上面所描述的指南,或者举一些例子C# 如何以C语言向我的所有应用程序发送一条消息?,c#,tcp,C#,Tcp,我一直在研究使用TCP通过网络发送消息 我目前的情况是,我有一台计算机上运行的单个应用程序的多个实例。我想发送一条TCP消息,让所有应用程序接收该消息并对其执行操作 我所能找到的只是一个发送者和一个接收者的例子。我不想只向网络发送TCP消息,让所有侦听应用程序接收相同的消息 我尝试过使用它,但它似乎也不适用于多个接收器 有没有人能给我指出一个正确的方向,让我找到一个我在上面所描述的指南,或者举一些例子 编辑:我试图发送的只是一个10个字符的字符串,也许还有另一种发送/接收类似内容的方法?如果您想
编辑:我试图发送的只是一个10个字符的字符串,也许还有另一种发送/接收类似内容的方法?如果您想向所有应用程序实例发送消息,您可以查看
信号器
有几篇文章介绍了这个框架:
可能很愚蠢,但很简单,也很可能。。当通过一个干净的界面进行抽象时,这可能是一个好的开始:为应用程序选择一个共享目录,将包含消息的文件写入该目录,并使用FileWatcher侦听目录中的更改
一旦您的应用程序需要增加,就用使用MSMQ或类似enterprisey的接口实现替换接口实现
另一个简单的解决方案是共享内存/。该API自v4起就包含在.NET framework中。不过,您必须手动执行读/写同步。这些是GUI应用程序吗?如果是,您可以使用目标为HWND\U广播的SendMessage
或PostMessage
。(尽管这只允许您发送一对数字,而不是“字符串”)
更复杂的,但正是为了这个目的而设计的,是一个
另一方面,邮件槽是一个进程向多个进程广播消息的简单方法
您可以使用C#中的共享内存来实现您的需求。
让我解释一个简单的解决方案:
例:
创建映射文件(使用特定名称,如“XXX”)
- 它将在内存中创建一个以字节为单位的数组
- 将第一个字节设置为零(0)或可以自己定义的值。(此字节将确定传入消息)
如果一个应用程序希望向其他应用程序发送消息:
- 将数据(使用UTF-8或任何编码转换为字节数组)从第三个元素(索引=2)写入内存数组
- 将第一个字节(索引=0)设置为1
- 将第二个字节设置为随机值(为什么要使用此字节?我将在下面解释。)
在接收端,它们还打开同名“XXX”的映射文件
- 它们需要在第一个字节触发以检测传入消息。您可以使用计时器(间隔为500毫秒)检查该字节
- 若第一个字节为1->它有传入消息,则从第三个元素(从索引2)读取数据
您现在可以从其他应用程序接收消息,但存在一个小问题:
- 在下一个触发器中,应用程序仍将继续将其视为有新的传入消息
- 所以此时,您需要读取第二个(随机)字节的值,并将其存储为备份,以便在下一个触发器中进行比较
- 如果备份id不等于新id,则这是一条真正的新传入消息
希望这能解释你如何解决这个问题@Adriano我正在检查这个问题……你不能在本地广播中使用UDP吗?就我个人而言,我会使用一个预先存在的集线器。也许redis pub/sub-这对设置来说非常简单(即零配置、零注册-只是“发布频道名称消息”
),UDP广播听起来像是我需要的协议。谢谢你到目前为止的建议。如果你想有一个可靠的网络通信,UDP不是你想要的。它缺少错误传递检查并在失败时重试(TCP具有的功能)。但是,如果您只在单个接口上本地工作,或者不关心消息是否确实会被接收,那么请尝试:)