0MQ 远程登录数据 C++

0MQ telnet data C++

我正在尝试在 VS2013 上使用 0MQ 和 C++ 发送 telnet 命令。

我使用了 ZMQ 主页上的 HW 客户端示例代码。

但我在 WireShark 上看到的是 telnet 数据包,里面没有数据。

这段代码是原型,我需要的只是能够发送这条命令。

让它工作后,它会得到一些清洁。

//
//  Hello World client in C++
//  Connects REQ socket to tcp://localhost:5555
//  Sends "Hello" to server, expects "World" back
//
#include <zmq.hpp>
#include <zmq.h>
#include <string>
#include <iostream>

int main()
{
    //  Prepare our context and socket
    zmq::context_t context(1);
    zmq::socket_t socket(context, ZMQ_REQ);

    std::cout << "Connecting to hello world server…" << std::endl;
    socket.connect("tcp://10.40.6.226:23");

    //  Do 10 requests, waiting each time for a response
    for (int request_nbr = 0; request_nbr != 1; request_nbr++) {
        zmq::message_t request(2);
        memcpy(request.data(), "Hello", 5);
        std::cout << "Sending Hello " << request_nbr << "…" << std::endl;
        socket.send(request);
        //client_socket

        //  Get the reply.
        /*zmq::message_t reply;
        socket.recv(&reply);
        std::cout << "Received World " << request_nbr << std::endl;*/
    }
    return 0;
}

所以一切看起来都很好,除了我在 telnet 数据包中看不到字符串 "Hello"。

原始样本http://zguide.zeromq.org/cpp:hwclient

是的,可以通过 ZeroMQ

发送 telnet 命令

这样做没有主要障碍。一旦你在 ZeroMQ 上正确设置了端到端关系,你的 telnet-commands 就可以顺利地流过 link,满足所有必需的底层协议特定的握手和事件处理。

为什么它在这里不起作用?

最强烈的原因 "behind" 观察到的场景是,您 错过了 ZeroMQ 正式通信模式 的本质框架。

ZeroMQ 套接字不是 "plain"-套接字,因为套接字这个词的重复使用提醒。如果 ZeroMQ 只是模仿操作系统中已经可用的哑套接字,那么将有接近 none 的好处。人们可能从 ZeroMQ 中获益的最大智力价值正是基于相反的方法。多亏了 AQMP 和 ZeroMQ 及其年轻祖先诞生的数千人*年的经验,框架内置了智能功能,我们很乐意在我们的应用程序领域中重用这些功能,而不是尝试重新发明轮子。

最好的下一步是什么?

假设一个人对智能消息传递的兴趣没有丧失,恕我直言,下一步最好的办法是花时间阅读


+ 一个小提示,为什么代码不通过线路移动任何数据

引入 ZeroMQ 架构的良好设计实践将传输本身与套接字原型的连接状态分开。也就是说,一个人可能 "pump-data-into" a-socket-archetype 的本地端(你的代码 .send()-s 10x 在 for 循环中)但是远程端不需要在整个剧集中在线(或根本不在线)。这意味着,当且仅当正式通信模式的两个端点都同意这样做时,PHY 层(电线)将看到并传输任何数据。

REQ/REP场景中意味着

  1. {REQ|REP}.bind() <-online-visibility-episode-> {REP|REQ}.connect()状态
  2. REQ.send()-> REP.recv()
  3. REP.send()-> ( REQ.recv())
  4. REQ.send()->

保持 REQ/REP 正式沟通模式 "forward-stepping".

的旋转木马政策的性质

在发布的 for(){...} 代码块中,这意味着如果遇到 step 1.,您可以只检测第一条也是唯一一条消息从 REQREP,因为你似乎没有注意执行强制步骤 2. & 3..recv() REPREQ-行为模型之前的响应允许发送任何下一个请求(这是 REQ/REP 模式的核心性质,不是吗?)。

一旦您对 ZeroMQ 有了更深入的了解,您也会习惯于检查与各个函数调用相关的错误。

调用 .connect() 尝试,(幸运的是通过 port 23 )到 telnet-daemon 的手将在电线上可见-级别,但是协议级握手几乎不允许正确制定的​​ ZeroMQ 线级协议消息(如果处于非透明模式(假设是 telnet),这肯定会让线级嗅探器感到惊讶)使 telnet 开心-daemon 进程,除了 telnet-protocol-session 设置对话外,它什么都不等待,在描述的场景中,它必须无法满足。