我试图在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数据包中。
答案 0 :(得分:1)
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
方案中,这意味着
{REQ|REP}
.bind()
<-online-visibility-episode->
{REP|REQ}
.connect()
州REQ
的 .send()
强> -> REP
的 .recv()
强> REP
的 .send()
强> -> ( REQ
的 .recv()
强> )
REQ
的 .send()
强> ->
保持 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协议会话设置对话框之外别无他法,在描述的场景中必须无法满足。