Before the change, if we want to send more frames in a single call, we had to go through a vector, like this:
zmq::Frames frames; frames.reserve(3); frames.push_back(id); frames.push_back(""); frames.push_back(payload); socket_.send(frames);It was boring to write code like this, and the result was not very readable.
Now we can get the same result in a single line:
socket_.send(id, "", payload);It is not a big change in the code. I changed slightly the original send() function, and moved it in the private class section:
bool send(const char* frame, size_t len, int flags =0) { zmq::message_t msg(len); memcpy(msg.data(), frame, len); return socket_t::send(msg, flags); }Some more information on zmq::Socket is available in a previous post.
The main change at this level is in the fact that the message length is now passed as an input parameter.
In the public interface, the one-frame-at-the-time functions become:
bool send(const std::string& frame, int flags =0) { return send(frame.c_str(), frame.length(), flags); } bool send(const char* frame, int flags =0) { return send(frame, strlen(frame), flags); }If we pass a STL string, its size is already known, cached in the object, so we use it. Otherwise it is calculated by a call to strlen(). When we use these overload we should explicitly say if we consider the current frame as part (and not the last one) of a multipart message.
The two- and three-part messages could be now be sent with a single call. Let's see the three-part by c-string parameter overload:
bool send(const char* frame1, const char* frame2, const char* frame3) { if(!send(frame1, ZMQ_SNDMORE)) return false; if(!send(frame2, ZMQ_SNDMORE)) return false; // last frame return send(frame3); }The first two frames are sent with the SNDMORE flag, going through above descripted single-frame overload, the last one is terminating the sequence.
The improved include file is on github.
No comments:
Post a Comment