ZeroMQ提供零拷贝技术,尽可能避免网络复制数据。但它似乎不起作用(使用ZeroMQ v4.1.5进行测试)。
这是服务器代码:
void CustomCleanup(void *data, void *hint)
{
cout << "free1" << endl;
delete static_cast<std::string*>(hint);
}
void my_free (void *data, void *hint)
{
cout << "free2" << endl;
free (data);
}
int main()
{
//Allocate a string and zero copy it to client
std::string* messageString = new string("ABCDEFG");
cout << messageString->c_str() << endl;
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_PUSH);
socket.bind ("tcp://*:5555");
zmq_msg_t msg;
zmq_msg_init_data (&msg, messageString, messageString->length(), CustomCleanup, messageString);
zmq_send (socket, &msg, 7, 0);
cout << messageString->c_str() << endl;
//Malloc a data buffer and zero copy it to client
void *data = malloc (6);
assert (data);
memcpy (data, "ABCDEF", 6);
zmq_msg_t msg2;
int rc = zmq_msg_init_data (&msg2, data, 6, my_free, NULL); assert (rc == 0);
zmq_send (socket, &msg2, 6, 0);
}
这是客户端代码:
int main()
{
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_PULL);
socket.connect ("tcp://127.0.0.1:5555");
zmq::message_t message;
socket.recv(&message);
}
在调用每个 zmq_msg_init_data 之后,应调用解除分配器 CustomCleanup 和 my_free 以释放分配的内存,但在我的情况下,这样做不会发生。为什么呢?
注意:在服务器示例中,我使用new / malloc以及string和void指针来帮助查明潜在的错误,但在任何一种情况下它都不起作用。