0MQ telnet data C++
0MQ telnet data C++
我正试图在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
场景中,表示
-
{REQ|REP}
.bind()
<-online-visibility-episode->
{REP|REQ}
.connect()
国家 -
REQ
.send()
-> REP
.recv()
-
REP
.send()
-> ( REQ
.recv()
)
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设置对话,
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 收到错误"invalid use of non-static data member 'stu::n' "
- C++ 初始化 .data 部分中的变量
- 模式"allocate memory or use existing data"
- boost::asio data owning `ConstBufferSequence`
- Python to C++ Data structure API
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- protobuf C++ SQLite handle blob data
- 错误:字段'dateOfBirth'的类型不完整'Poco::Data::Date'
- 为什么构造函数 Message(const T&data) 与 Message(T&& data) 冲突,当 T = int&时?
- "thread-safe data"与"thread-safe code/functions"的区别
- 如何找到目标文件 *.o 的 ram rom 使用情况(.bss .text .rodata .data)?
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- 使用 .data() 将字符数组转换为 std::string 不会转换整个数组
- *(int*)&data[18]在这段代码中实际上做了什么?
- 出现这种错误的原因是什么"invalid use of non-static data member "
- 构造中错误:未在此范围中声明"data"
- 我可以在初始化之前使用 std::array 成员变量中的 data() 指针吗?发出警告
- 如何将data[i].int转换为vaible