C++ 为什么ZeroMQ的ZMQ_RCVHWM选项无效?

C++ 为什么ZeroMQ的ZMQ_RCVHWM选项无效?,c++,zeromq,C++,Zeromq,有一个端点,它是经销商,还有一个端点,它是路由器。经销商通过TCP协议连接到路由器。我将所有的ZMQ\u SNDHWM和ZMQ\u RCVHWM设置为1 请注意,经销商始终向路由器发送,但路由器不接收 问题是: 未设置路由器时,经销商只发送一条消息,然后被阻止。这是正确的,因为ZMQ\u SNDHWM是1 但当我设置路由器时,经销商可以继续发送大约4K的消息并阻止。为什么? 另外,如果我让路由器只接收一条消息,经销商可以再次发送大约4K的消息,但即使路由器继续接收,它也不能再发送任何消息。看来那

有一个端点,它是经销商,还有一个端点,它是路由器。经销商通过TCP协议连接到路由器。我将所有的
ZMQ\u SNDHWM
ZMQ\u RCVHWM
设置为1

请注意,经销商始终向路由器发送,但路由器不接收

问题是:

  • 未设置路由器时,经销商只发送一条消息,然后被阻止。这是正确的,因为
    ZMQ\u SNDHWM
    是1

  • 但当我设置路由器时,经销商可以继续发送大约4K的消息并阻止。为什么?

  • 另外,如果我让路由器只接收一条消息,经销商可以再次发送大约4K的消息,但即使路由器继续接收,它也不能再发送任何消息。看来那个商人死了。为什么会这样

  • 经销商代码:

    // create ctx
    void* ctx = zmq_ctx_new();
    assert(nullptr != ctx);
    
    // create in
    void* in = zmq_socket(ctx, ZMQ_DEALER);
    assert(in);
    int sndhwm = 1;
    assert(0 == zmq_setsockopt(in, ZMQ_SNDHWM, &sndhwm, sizeof(sndhwm)));
    assert(0 == zmq_setsockopt(in, ZMQ_RCVHWM, &sndhwm, sizeof(sndhwm)));
    
    int rc = zmq_connect(in, "tcp://127.0.0.1:1012");
    assert(!rc);
    
    char content[100] = {0};
    int size = 0;
    int64_t nCount = 0;
    while(1)
    {
        sprintf_s(content, "%d", ++nCount);
        size = strlen(content);
        rc = zmq_send(in, content, size, 0);
        assert(rc = size);
        printf("in = %d\n", nCount);
    }
    
    路由器代码:

    // create ctx
    void* ctx = zmq_ctx_new();
    void* out = zmq_socket(ctx, ZMQ_ROUTER);
    int sndhwm = 1;
    assert(0 == zmq_setsockopt(out, ZMQ_SNDHWM, &sndhwm, sizeof(sndhwm)));
    assert(0 == zmq_setsockopt(out, ZMQ_RCVHWM, &sndhwm, sizeof(sndhwm)));
    
    int rc = zmq_bind(out, "tcp://127.0.0.1:1012");
    assert(!rc);
    
    while(1)
    {
    
        string cmd;
        cin >> cmd;
    
        zmq_msg_t msg;
        while(true)
        {
            zmq_msg_init(&msg);
            rc = zmq_recvmsg(out, &msg, 0);
            assert(rc > 0);
    
            printf("out = %s\n", (char*)zmq_msg_data(&msg));
            if(!zmq_msg_more(&msg))
            {
                break;
            }
        }
    }
    

    听起来你有几个问题没有明确的联系——你应该把它们分成多个部分questions@Soren我想它们都是关于标题的。而且,把它们放在一起可能会更容易找到解决方案。你的标题更多的是一个断言而不是一个问题——你可以看到,你在几乎24小时后都没有答案,这就是为什么你应该在这个网站上以有意义的方式问他们——作为这里的新用户,你应该感谢你的提醒。正如你所看到的,我是一个新的用户在这里与我的池英语。所以我再问一次,希望你能帮我校对一下。再次感谢。我发了一封回复,请查看。顺便说一句,你的第三个问题(在这个问题内)不清楚。