简单的线协议,该怎么办?

7
我有一个用C语言编写的简单服务器,其主要目的是使用专有协议与一些商业伙伴通信。由于这个原因和其他一些原因,它必须用C语言编写。然而,我还有其他一些进程,使用其他语言编写(例如Python),必须与服务器进行通信(在同一台Linux服务器上本地通信)。
在这种情况下,跨语言IPC的最佳选择是什么?具体而言,我认为我已经掌握了传输技术:Unix域套接字、命名管道、共享内存、ZeroMQ(Crossroads)。我更感兴趣的是实现协议的最佳方法,以便保持C代码的小巧和可维护性,同时仍然允许其他语言进行通信。
编辑:似乎存在一些混淆。我不感兴趣讨论域套接字、共享内存等的优缺点。我对msgpack(感谢unwind)和其他技术/方法来实现传输协议很感兴趣。

猜测的话,如果您想要串行传输数据,可以使用套接字;如果您想要更快速和更随机的进程间通信,则可以使用共享内存+共享信号量。 - Shahbaz
好的,那你需要哪些编程语言,并且协议上有什么要求?如果只是在Linux上使用C&Python,你可以轻松地使用固定大小的结构体来完成。 - Useless
Go实际上是主要的另一个,Haskell是一个不错的选择。 - brooks94
2个回答

4

在未知需求的情况下优化(即选择“最佳”)很难。您确实表示您的目标是保持C代码“小而易维护”,这似乎意味着您应该寻找一个库。也许使用本地套接字的msgpack库?

此外,您的基本前提是必须使用C编写服务器,因为您有一种专有协议,这似乎有点奇怪。


4
编辑:你需要的是一个“序列化框架”,也就是可以将内存结构转换为字节流的东西。最好的候选项包括: 优缺点: Protocol Buffers
  • + 快速
  • + 易于版本管理(当您第一次需要更改消息格式时,您会开始非常喜欢它,并在此之前将其诅咒到地狱)
  • - 解决了许多你尚不知道的问题,因此API有点“奇怪”。我向您保证,他们这样做的原因和方式非常好,但有时您会感到困惑。
我对MessagePack不太了解。
最后: JSON
  • + 任何语言都可以读取和编写JSON数据。
  • + 无需使用工具即可进行人类可读的操作
  • - 有点慢
  • - 格式非常灵活,但如果您需要进行大量更改,则需要找出一种策略以确定读取消息时的格式(即哪些字段)。
至于传输层:
优缺点: 共享内存
  • + 最快的选项
  • - 您需要第二个通道(如信号量)来告诉其他进程数据现在已准备好
  • - 当您尝试连接两个以上的进程时,情况会变得非常丑陋
  • - 特定于操作系统
命名管道
  • + 非常容易设置
  • + 相当快
  • - 仅允许两个进程进行交谈...或者更确切地说,一个进程可以单向与另一个进程交谈。如果您需要双向通信,则需要使用多个管道
套接字
  • + 设置相当容易
  • + 可用于所有语言
  • + 允许远程访问(不需要所有进程都在同一台计算机上)
  • + 一个服务器和多个进程之间的双向通信
  • - 比shmem和pipes慢
ZeroMQ
  • + 像套接字一样,但更好
  • + 现代API(不是那些旧的IPC/套接字垃圾)
  • + 支持多种语言...
  • - ...但不是所有语言

如果可以的话,建议尝试使用ZeroMQ,因为它是一个现代框架,可以解决许多旧技术所遇到的问题。

如果尝试失败了,可以考虑使用套接字。它们易于使用,得到广泛支持。


抱歉,它被藏得太好了,在你不感兴趣的事物下面 :-) - Aaron Digulla
3
我正在使用 ZeroMQ 和 Protocol Buffers 来实现类似的功能。它们非常好用,相比低级别的 sockets 和手动解析字节,能够加快原型开发速度。我非常满意 ProtoBuf 的表现。ZeroMQ 也不错,但是有一些奇怪的小问题。 - japreiss
+1 对于 pb 和 zmq 的组合非常赞。我在很多连接 C++ 和 Python 的代码中都使用它。 - g19fanatic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接