当通过tcp接收编码图像的消息时,zmq在第二个循环中崩溃
zmq crash in the second loop when recv message of an encoded image through tcp
在以下使用zmq和opencv编码和解码的示例中,服务器在显示收到的第一个图像后,在recv((函数中崩溃。我想知道是否有人知道代码崩溃的原因。
崩溃消息是"内存位置的C++异常:zmq::error_t。">
服务器
#include <zmq.hpp>
#include <string.h>
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "fstream"
#include "iostream"
int main()
{
// Prepare our context and socket
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://*:6666");
while (true)
{
// receive message
std::string msgStr;
{
zmq::message_t message;
socket.recv(&message);
msgStr = std::string((char*)message.data(), message.size());
}
// unserialize to cv::mat
cv::Mat loaded_data;
{
std::vector<uchar> data(msgStr.begin(), msgStr.end());
loaded_data = cv::imdecode(data, CV_LOAD_IMAGE_GRAYSCALE);
}
// show cv::mat
{
std::cout << "waiting for your key press on the image." << "n";
cv::imshow("load", loaded_data);
cv::waitKey(0);
}
}
socket.close();
return 0;
}
客户端
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "fstream"
#include "iostream"
int main()
{
zmq::context_t context(1);
zmq::socket_t sock(context, ZMQ_REQ);
sock.connect("tcp://localhost:6666");
std::string data;
{
cv::Mat Imgdata = cv::imread("wall.jpg", CV_LOAD_IMAGE_GRAYSCALE);
std::vector<uchar> data_encode;
cv::imencode(".jpg", Imgdata, data_encode);
data = std::string(data_encode.begin(), data_encode.end());
}
// send
{
zmq::message_t message(data.size());
memcpy(message.data(), data.c_str(), data.size());
sock.send(message);
}
sock.close();
system("pause");
return 0;
}
不要忽略recv函数的返回。执行if(socket.recv(...)) { // Process image }
将避免在接收过程中出现错误时执行代码。
您正在使用REQ/REP套接字。这是一个同步协议。REQ最初可以发送消息,并且处于阻塞状态,只要他们没有对请求的回复。REP最初可以收到一条消息,只要他们没有回复请求,就会处于阻止状态。
在收到第一个图像后回复REQ套接字,或者使用另一种模式:ZMQ_PAIR、PUSH/PULL、ROUTER/DEALER都可以在您的情况下工作。阅读文档以了解不同的模式。
此外,您不必在字符串中转换图像。您可以使用zmq直接发送std::vector<uint8_t>
:您可以使用std::vector::data()
和memcpy(message.data(), vector.data(), vector.size())
访问底层指针。
相关文章:
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 等待整个 omp 块完成,然后再调用第二个函数
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 将第二个 GATT 服务添加到 Movesense 容器
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 使第二个类的构造函数成为第一个类中的友元函数
- 为什么第二个代码给出了预期的结果,而第一个代码却没有?
- 为什么第一个代码块产生垃圾值,而第二个代码块将类成员的值相加?
- 打印无序映射的第二个元素,即集合
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 需要使用模板查找数组的第二个最小和最小值
- c++:交换向量中所有元组的第一个和第二个元素
- 如果条件,当我想第二个参数时
- 将内容从第一个文件("constituencies")移动到第二个文件("temp")并在之后重命名时,我的文件被删除
- 当通过tcp接收编码图像的消息时,zmq在第二个循环中崩溃