0MQ telnet data C++

0MQ telnet data C++

本文关键字:C++ data telnet 0MQ      更新时间:2023-10-16

我正试图在VS2013上使用c++与0MQ发送 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命令就可以顺利地在链路上流动,满足所有需要的底层协议特定的握手和事件处理。

为什么这里不起作用?

所观察到的场景"背后"最强大的原因是,您已经错过了ZeroMQ 正式通信模式框架的本质

ZeroMQ套接字不是"普通的"套接字,因为重复使用"套接字"这个词会让人想起它。如果ZeroMQ只是模仿操作系统中已有的哑套接字,那么几乎没有任何好处。ZeroMQ最大的智力价值是基于相反的方法。多亏了几千年的经验才促成了AQMP和ZeroMQ的诞生。我们很乐意在我们的应用领域中重用框架内置的智能特性,而不是试图重新发明轮子。

最好的下一步是什么?

假设一个人对智能消息传递的兴趣没有失去,我认为最好的下一步是花时间阅读一本伟大的书"Code Connected, Vol.1",作者是ZeroMQ的共同父亲Pieter HINTJENS>>> https://stackoverflow.com/a/25742744/3666197


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

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

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. ,则可以电线检测从 REQ REP 的第一条和唯一一条消息,因为您似乎不注意执行强制性步骤2. &3. .recv() 一个响应从 REP 之前,REQ行为模型将允许发送任何下一个请求(这是REQ/REP模式的核心性质,不是吗?).

一旦你的ZeroMQ深入了解,你也会习惯检查与相应的函数调用相关的错误。

调用.connect()尝试,导演(幸运的是 port 23 )的手telnet-daemon可见连接级别的,然而一个协议一级握手不会允许一个正确制定ZeroMQ-wire-level协议消息(当然意外连接级别的嗅探器如果在不透明的模式(假设一个telnet))使telnet-daemon过程快乐,等待别的但telnet-protocol-session设置对话,