我正在尝试在 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”。
最佳答案
是的,一个可以发送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
场景意味着
-
{REQ|REP}
<强>.bind()
<-online-visibility-episode->
{REP|REQ}
<强>.connect()
状态 -
REQ
<强>.send()
-> REP
<强>.recv()
-
REP
<强>.send()
-> ( REQ
<强>.recv()
)
-
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/