【问题标题】:How to implement fire-and-forget messaging from one process to another?如何实现从一个进程到另一个进程的即发即弃消息传递?
【发布时间】:2015-04-28 08:02:04
【问题描述】:

点击一个按钮,一条简单的消息就会从一个进程发送到另一个进程,该消息只是一个带有字符串参数的简单命令,总共大约 50 个字符(绝对小于 1k),例如

DisplaySomeInfo("param1", "param2")

并满足以下条件:

  • 必须简单(即没有成熟的消息传递系统)
  • 必须在 Windows 上运行,应该在 Unix 上运行
  • 下图显示了我的实际需求,但它应该适用于任何主要的编程语言/运行时
  • 性能并不重要,对于这么简单的消息,整个发送/接收周期不应超过一毫秒
  • “保送”等不必要
  • 发送者不关心接收者是否收到消息 - 或者是否有接收者首先
  • 无需加密/认证/授权

在维基百科中有一个很长的list of ways to do IPC,但最简单的似乎是非连接套接字选项。

有没有比简单地发送/接收 UDP 数据包(每个数据包一条消息,TTL=0)更好的方法(更容易实现/维护/调试,更多的未来证明......)来实现它,比如加上一个JSON(反)序列化器?

【问题讨论】:

标签: udp ipc messaging fire-and-forget


【解决方案1】:

对于这些要求,简单地将 UDP 单播数据包发送到 localhost 上的某个端口似乎是理想的。唯一的问题是必须选择和固定端口号。但如果这不是问题,那么简单地发送和接收 UDP 数据包就非常简单,无需第三方库。

从 .Net 应用程序发送 UDP 数据包的简单示例:

public static void SendUdpPacket(int destinationPort, string payload)
{
    IPEndPoint endPoint =
      new IPEndPoint(IPAddress.Parse("127.0.0.1"), destinationPort);
    byte[] buffer = Encoding.UTF8.GetBytes(payload);
    Socket socket =
      new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    socket.SendTo(buffer, endPoint);
    socket.Close();
}

唯一悬而未决的问题是如何编码多个参数。但为此有无数种方法,许多语言都内置了 HTTP URL 编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2023-01-26
    • 2019-09-16
    • 2010-10-11
    • 2011-05-14
    • 2019-04-14
    相关资源
    最近更新 更多