【问题标题】:Rust, libzmq, client only send message, when followed by receiveRust,libzmq,客户端只发送消息,然后是接收
【发布时间】:2021-06-25 14:39:49
【问题描述】:

我正在测试 Rust libzmq 客户端

https://crates.io/crates/libzmq

https://docs.rs/libzmq/0.2.5/libzmq/struct.ClientBuilder.html

偶然发现了这种奇怪的行为。

此客户端不会发送消息:

use libzmq::{prelude::*, *, ServerBuilder, ClientBuilder, TcpAddr};

fn main() -> Result<(), String> {
    
    let saddr = format!("{}:{}", "192.168.1.206","5540");
    println!("Strating client for {}", saddr);
    let addr2: TcpAddr = saddr.try_into().unwrap();
    
    let client = ClientBuilder::new()
        .connect(&addr2)
        .build().unwrap();
    client.send("test").unwrap();

    println!("Finished");
    Ok(())
}

这将发送:

use libzmq::{prelude::*, *, ServerBuilder, ClientBuilder, TcpAddr};

fn main() -> Result<(), String> {
    
    let saddr = format!("{}:{}", "192.168.1.206","5540");
    println!("Strating client for {}", saddr);
    let addr2: TcpAddr = saddr.try_into().unwrap();
    
    let client = ClientBuilder::new()
        .connect(&addr2)
        .build().unwrap();
    client.send("test").unwrap();

    let mut msg = Msg::new();
    client.recv(&mut msg).unwrap();

    println!("Finished");
    Ok(())
}

为了接收,我使用的是 python 服务器(但我也在 Rust 上进行了测试):

import zmq
if __name__ == '__main__':

    context = zmq.Context()
    socket = context.socket(zmq.SERVER)
    socket.bind("tcp://0.0.0.0:5540")
    print("waiting for hand shake")
    m = socket.recv(copy=False)
    print("got it...")
    socket.send(b'READY', routing_id=m.routing_id)
    print("sent reply")
    socket.close()
    context.term()

代码 1 的服务器端输出:

waiting for hand shake
[blocked]

代码 2 在服务器端的输出:

waiting for hand shake
got it...
sent reply

将此版本用于 Rust:

[dependencies]
libzmq = "0.2.5"

【问题讨论】:

    标签: rust zeromq


    【解决方案1】:

    libzmq crate 只是libzmq C library 的包装。在documentation for the C library,你会发现这个注释:

    注意:成功调用 zmq_msg_send() 并不表示 消息已传输到网络,只是它已排队 'socket' 和 0MQ 已经承担了消息的责任。

    在您的第一个示例中,由于程序在调用send 后立即退出,因此消息仍在libzmq 队列中,尚未传输。在您的第二个示例中,消息在您的程序等待 recv 调用时被传输。

    【讨论】:

      猜你喜欢
      • 2015-03-28
      • 2020-07-10
      • 1970-01-01
      • 2015-01-16
      • 2021-10-09
      • 1970-01-01
      • 2020-12-28
      • 2017-09-30
      • 2019-08-25
      相关资源
      最近更新 更多