c++ - 0MQ 远程登录数据 C++

标签 c++ networking zeromq telnet

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

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

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

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

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

//
//  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

最佳答案

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

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

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

观察到的场景“背后”最强有力的原因是,您错过了 ZeroMQ 正式通信模式框架的本质。

ZeroMQ 套接字不是“普通”套接字,正如套接字一词的重复使用所提醒的那样。如果 ZeroMQ 只是模仿操作系统中已经可用的哑套接字,那将几乎没有任何好处。人们可能从 ZeroMQ 中获益的最大智力值(value)正是基于相反的方法。多亏了 AQMP 和 ZeroMQ 及其年轻祖先诞生的数千人*年的经验,框架内置了智能功能,我们很乐意在我们的应用程序领域中重用这些功能,而不是尝试再次重新发明轮子。

最好的下一步是什么?

假设一个人对智能消息传递没有失去兴趣,恕我直言,下一步最好的办法是花时间阅读 great book "Code Connected, Vol.1" from Pieter HINTJENS, a co-father of the ZeroMQ >>> https://stackoverflow.com/a/25742744/3666197


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

引入 ZeroMQ 架构的良好设计实践将传输本身与套接字原型(prototype)的连接状态分开。也就是说,可以将数据“泵入”a-socket-archetype 的本地端(您的代码 .send() -for 循环中的 10x)但远程端不需要在整个剧集中(或根本)在线。这意味着,当且仅当正式通信模式的两个端点都同意这样做时,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 正式沟通模式“向前迈进”。

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

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

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

关于c++ - 0MQ 远程登录数据 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31740674/

相关文章:

c++ - OpenGL 如何进行单元测试?

c++ - OpenCV findContours 堆栈溢出

c++ - 指向 cv 和/或 ref 限定成员函数的指针的 Typedef

python - 在 zeromq/python 中使用 pyobj 子函数时设置主题

java - 安装并运行 ZeroMQ

c++ - c++中的闪烁字母

c# - 网络接口(interface)子类型 .Net Framework 4.0

css - Chrome 中未加载谷歌字体(谷歌服务器返回未找到状态)

http - 如何定义 HTTP 对象?

python - ZeroMQ 与子进程的双向异步通信