0MQ telnet数据C ++

时间:2015-07-31 07:39:22

标签: c++ networking zeromq telnet

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

我使用了来自ZMQ hompage的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;
}

所以一切看起来都不错,我看不到字符串&#34;你好&#34;在telnet数据包中。

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

1 个答案:

答案 0 :(得分:1)

是的,可以通过ZeroMQ发送telnet命令

这样做没有主要障碍。一旦您通过ZeroMQ正确设置了端到端关系,您的telnet - 命令就可以顺利地流过链路,满足所有必需的基础协议特定的握手和事件处理。

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

观察到的情景“背后”的最大原因是,您错过了ZeroMQ 正式沟通模式框架的本质

ZeroMQ套接字不是“普通”套接字,因为可以重用单词套接字提醒。如果ZeroMQ只是模仿操作系统中已有的哑套点,那么几乎没有任何好处。可以从ZeroMQ中获益的最大智力价值是基于相反的方法。感谢AQMP和ZeroMQ&amp; A的诞生带来的数千人*年的经验。他们的年轻祖先,内置的智能功能我们很乐意在我们的应用领域重复使用,而不是试图重新发明轮子。

最好的下一步?

假设一个人对智能短信的兴趣不会丢失,那么下一步最好的恕我直言就是花一点时间阅读great book "Code Connected, Vol.1" from Pieter HINTJENS, a co-father of the ZeroMQ >>> https://stackoverflow.com/a/25742744/3666197

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

ZeroMQ架构带来了一个很好的设计实践,它将传输本身与socket-archetype的连接状态分开。也就是说,人们可以“将数据泵入”一个socket-archetype的本地端(你的代码 .send() -s 10x in 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() ->
  5. 保持 REQ/REP 正式沟通模式“前进”的旋转木马政策的性质。

    在发布的for(){...}代码块中,这意味着如果符合 step 1. ,您可以仅检测来自 {的第一条和唯一一条消息{1}} REQ ,因为您似乎没有注意执行强制性步骤REP&amp;在2. - 行为模型允许发送任何下一个请求之前, 3. 来自 .recv() 的回复REP (这是REQ模式的核心性质,不是吗?)。

    一旦您的ZeroMQ洞察力进一步提升,您也会习惯于检查与各个函数调用相关的错误。

    调用REQ/REP尝试,指向(幸运的是超过 .connect() )到port 23的手将在线级可见,但是协议级握手几乎不允许正确制定的​​ZeroMQ-wire-level协议消息(如果处于非透明模式(假设一个telnet),这肯定会让线级嗅探器感到惊讶)使telnet-daemon进程满意除了一个telnet协议会话设置对话框之外别无他法,在描述的场景中必须无法满足。