c++ - 如何正确选择 zmq 最大缓冲区大小?

标签 c++ c sockets zeromq

根据 ZMQ 手册

The ZMQ_SNDBUF option shall retrieve the underlying kernel transmit buffer size for the specified socket. A value of zero means that the OS default is in effect. For details refer to your operating system documentation for the SO_SNDBUF socket option.

如何以简单的跨平台方式获取它? 或者是像这样以某种方式获得它的唯一方法:

#ifdef _WIN32
some_win_actions
#else
some_other_actions
#endif

问题的另一部分:例如,如果我的操作系统默认 SO_SNDBUF 为 10,而客户端的操作系统 SO_SNDBUF 为 5, 它会导致错误,还是 ZMQ 会在客户端以某种方式处理它?<​​/strong>

最佳答案

Inital note: ZeroMQ buffers and High-watermark(s) for cross-platform code

除了您最初的两个问题之外,还有一个问题需要注意。由于 ZeroMQ 库的不同版本,缓冲区和高水位线机制可能不同。

例如:基于 Unix 的网格计算服务在 C++ 和 Python 服务组件中使用最新的 ZeroMQ 版本。

此服务对客户端连接开放,其中没有版本控制可能负责保持版本更新。因此,最终的场景将不得不处理最近的 ZeroMQ 连接(缓冲区和高水位线的机制将在两侧匹配),但也有大量用户不会或什至不能(一些跨平台基于 DLL 的包装器等问题)所以只需更新底层 ZeroMQ 版本。它们的缓冲区将具有其他高水位线行为,并且您的一方不能采取任何一步来将其更改为您希望的任何方向。

问:...ZMQ 会在客户端以某种方式处理它吗?

绝对不是。 ZeroMQ 是一个非常强大的工具,但是有一个严格的简约设计,如果您自己的代码没有创建一些方法来这样做,它可以避免任何远程端干预。

跨平台解决方案

在这些基础上应该有一些其他的逻辑——设置你的代码设计,这样它就不会破坏你的资源(缓冲区/高水位线)。

只需将目标颠倒过来即可。设计软件以最大程度地接近零*命令(使用最少的合理数量的资源),而不是依赖最大值(这是您无法控制的 - 代码方面和版本方面)。

这样你的代码就不会受到实际值的影响。代码在您的控制之下,而不是操作系统提供的内部机制或缓冲区约束。

通过这种方法,您的代码将是跨平台的,并且是版本证明的。

关于c++ - 如何正确选择 zmq 最大缓冲区大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30953631/

相关文章:

c++ - 如何安全地在 C++/Ocaml 之间转换树数据结构?

c++ - 用于本地 IPC 的基于内存的数据服务器

c - C中的自修改代码 : Use a function pointer?

c++ - 为什么设置套接字发送/接收缓冲区大小大于 sysctl max 时没有错误?

C++ SFML UDP Socket 向多个客户端接收和发送数据

c++ - 如何检测之前连接的 SSL/TCP 套接字上的互联网断开连接?

C++ 循环继承和类

c++ - 重载 ostream&<< 以与类相反的顺序输出 vector

c++ - 根据键组合两个映射的值

C typedef 指向 func 的指针,参数指针指向结构