根据ZMQ手册
ZMQ_SNDBUF选项应检索底层内核传输 指定套接字的缓冲区大小。值为零意味着 操作系统默认有效。有关详细信息,请参阅您的操作系统 SO_SNDBUF套接字选项的文档。
如何以简单的跨平台方式获取? 或者是获得它的唯一方式:
#ifdef _WIN32
some_win_actions
#else
some_other_actions
#endif
问题的 另一部分 :例如,我的操作系统默认SO_SNDBUF为10,客户端操作系统SO_SNDBUF将是5,会导致错误,还是ZMQ会在客户端以某种方式处理它?</ strong>
答案 0 :(得分:0)
除了你原来的两个问题之外,还有一个需要注意的问题。由于ZeroMQ库的版本不同,缓冲区和高水印机制可能会有所不同。
例如:基于Unix的网格计算服务在C ++和python-service组件中使用最新的ZeroMQ版本。
此服务对于客户端连接是开放的,其中没有版本控制可能负责保持版本更新。因此,最终的场景必须处理最近的ZeroMQ连接(其中Buffers和High-Watermarks的机制将在两侧匹配)但是也有大量用户,他们没有甚至不能(某些跨平台)基于DLL的包装器等问题,所以只需更新底层的ZeroMQ版本。他们的缓冲区将具有其他高水印行为,并且您的一方无法按照您希望的任何方向执行任何操作。
绝对不是。 ZeroMQ是一个非常强大的工具,但是有一个严格的简约设计,如果你自己的代码没有创建一些方法来避免任何远程端干预。
在这些理由上应该有一些其他逻辑 - 设置你的代码设计,这样它就不会破坏你的资源(Buffers / High-Watermarks)。
简单地将目标颠倒过来。设计软件以便最大限度地接近Zero-*命令(使用最少的合理数量的资源),而不是依赖于最大值(不受控制 - 代码和版本)。
这样,您的代码不会受到其实际值的影响。代码在您的控制之下,而不是操作系统提供的内部机制或缓冲区约束。
使用这种方法,您的代码将是跨平台的,并且还可以进行版本验证。