根据 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/