【问题标题】:nng to pynng communication is not workingnng 到 pynng 的通信不起作用
【发布时间】:2020-08-23 23:24:34
【问题描述】:

我正在尝试制作一个通过 nng 发布图像的 c 程序服务器,以及一个通过 pynng 订阅图像的 python 客户端。

由于某种原因,我无法连接这两个部分,我不知道为什么。 C/C++ 程序编译和运行良好,python 程序也是如此,但是在 C/C++ 程序上发布了一些内容,在 python 客户端上没有收到任何内容。客户端和服务器在同一台机器上运行。这是我的服务器 C/C++ 代码:

#include <nng/nng.h>
#include <nng/protocol/pubsub0/pub.h>

int main(int argc, char* argv[]){

    nng_socket sock;
    int rv;
    const char *url = "tcp://0.0.0.0:2234";

    if ((rv = nng_pub0_open(&sock)) != 0) {
            fatal("nng_pub0_open", rv);
    }
    if ((rv = nng_listen(sock, url, NULL, 0)) < 0) {
            fatal("nng_listen", rv);
    }

    // camera setup code omitted

    while(1){
        INT r = IS_SUCCESS;
        char* frame =(char*) d.processNextFrame(50,r); // grab image. if not successful, continue loop
        if (r != IS_SUCCESS || !frame)
            continue;

        std::cout << "frame caught... "<< bpp * nImgW * nImgH<< std::endl;

        if ((rv = nng_send(sock, frame, bpp * nImgW * nImgH, 0)) != 0) {
            fatal("nng_send", rv);
        }else{
            std::cout << "Frame Sent... "<< std::endl;
        }
    }
}

这是我的客户端python代码:

from pynng import Sub0, Timeout
address = 'tcp://127.0.0.1:2234'
sub2 = Sub0(dial=address, recv_timeout=5000)
print(sub2.recv())

有人可以帮我理解为什么这不起作用吗?

【问题讨论】:

    标签: python c nanomsg pynng


    【解决方案1】:

    您必须在订阅套接字上订阅主题,否则您将不会收到任何内容。为了接收所有消息,订阅空字符串:

    from pynng import Sub0, Timeout
    address = 'tcp://127.0.0.1:2234'
    # note the additional keyword argument, topics:
    # =============================================
    sub2 = Sub0(dial=address, recv_timeout=5000, topics=b'')
    print(sub2.recv())
    

    这里是 Sub0 的 pynng 文档。

    我是 pynng 的创建者。在文档中明确指出不订阅任何内容意味着您将永远不会收到任何东西,这可能会很好。这是一个常见的混淆点。

    【讨论】:

    • 嗨,我发现如果我设置 sub2 = Sub0(dial=address, recv_timeout=5000, topics=b'') 有效,但前提是我发送这样的简单消息:std::string tstdata("味精"); if ((rv = nng_send(sock, (void*)tstdata.c_str(), 3, 0)) != 0) 如果我发送如上所示的大数组,它不起作用。我应该添加一些额外的东西来使它工作吗?
    • “大”有多大? nng 过去默认丢弃大于 1 MB 的消息,我不记得最新的 pynng 是否保持这种行为。最新的 nng 版本现在默认允许任何消息,未来的 pynng 也将允许。
    • 您可以在子套接字上将recv_max_size 设置为0 以接受任何大小的消息。
    • 我正在尝试每条消息发送 5044624 个字节
    • 所以在子套接字上设置recv_max_size = 0 应该可以解决这个问题。
    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多