1

我正在使用 Python 和 Java 中的 ZeroMQ / ZMQ 并且有一个问题。发送较短的字符串时,ZMQ 使用此处所述的一个字节 ( http://zguide.zeromq.org/page:all#A-Minor-Note-on-Strings )

然后在线上的是一个长度(较短的字符串为一个字节)和字符串内容作为单个字符。

有谁知道发送更长的字符串时使用了多少字节?

4

1 回答 1

0

通过 ZMQ 发送时,较长的字符串使用多少字节?

这取决于更多的事情,而不仅仅是字符串本身:

您的帖子确实指的是历史文本 - zguide页面。

虽然这在 ZeroMQ v.2.x 的早期肯定是一个非常有用的第一次阅读源,但今天,我们使用跨越多个版本的,从 v.2.1+、3.x、4.x、4.2是迄今为止 2018-Q2 中最后一个稳定的 API 版本。

没有人可以先验地猜测消息发送方使用了什么 API 版本,直到接收方实际设置/接受链接设置并.recv()-s 相应的消息。在 v4.0 后的 API 中依赖基于 C-lang 的s_recv()-helper 技巧并不是一个确定的方向。

在 python 中,许多协议硬连线的细节仍然超出你的视线,但是有字节映射,它们完全按照仁慈的独裁统治,在已发布的 ZeroMQ RFC/ZMTP 规范中灌输,指示。


如果我们不能事先猜测或知道,我们能……吗?

是的,我们可以进行实验。最好设置一个受控的实验。

节点 A:发件人
可以是 pythonic,作为发件人:
- 设置一个REQ-archetype AccessNode (详细信息见“ZeroMQ Hierarchy in less than a 5 seconds”
-.setsockopt( zmq.IDENTITY, ... )使用随机生成的静态身份进行设置,
- 设置一个.setsockopt( zmq.REQ_RELAXED, 1 )
-.bind()它到所选传输类的已知端点
- 启动-s的xrange()-generator 控制-for L in xrange( 1, int( 1E+9 ) )循环 - 加载有效负载 - 处理相应的 REP 端“答案”, - 检查错误状态并调整-s / 重新循环,根据发送方套接字容量和发送更多有效负载的能力.send()
.send( r"{0:}|{1:}".format( str( L ), L * r"*" ) ).recv()
time.sleep()

节点 B:接收者 | MitM-sniffer
应该尽可能低级,以便反汇编 RFC/ZMTP 有线协议,因此 python 退出候选列表。ipc://如果所选的传输级别允许(一个或一个vmci://不允许),其他选项可能包括线级嗅探器

  • 设置一个ROUTER-archetype AccessNode,
  • .connect()它知道节点 A 使用的传输类端点,
  • 开始.recv()消息,

如果您的实验已正确获取/嗅探有关已知有效负载组合的 ZMTP 兼容传输大小的线级详细信息,您的问题将获得可重复、可验证、定量正确的string-size 到消息大小映射函数的记录。

奖励点:对于那些确实感兴趣的人。. .

接下来,
重新运行上面的受控白盒实验,
现在让节点 A:发送方将其行为扩展到
{ random | 确定性 } { 改变 | 改变它自己的配置
(或将这两个选项映射到一对相同的有效载荷 re- .send()s)
,并在其-loop 内部记录观察到的变化。
.setsockopt( zmq.REQ_CORRELATE, { on | off } )
for

就 2018 年第二季度 API v.4.2.x 允许的情况而言,这为最终答案增添了最后一笔。

于 2018-04-23T23:26:43.667 回答