进程内:inproc:///tmp/worker0
进程间:ipc:///tmp/worker0
自定义消息
struct Info {
short len = 0;
char content[10];
};
Server
void pub()
{
void *context = zmq_ctx_new ();
void *responder = zmq_socket (context, ZMQ_PUB);
int rc = zmq_bind (puber, SOCKET_CHANNEL);
if (rc != 0) printf("bind fail %d", rc);
assert (rc == 0);
zmq_pollitem_t pollItem[] = { {responder, 0, ZMQ_POLLOUT, 0} };
long timeout = 1000;
int request = 0;
while (1) {
rc = zmq_poll(pollItem, 1, timeout);
if (rc < 0) {
printf("poll failed: %s\n", zmq_strerror(zmq_errno()));
}
else if (0 == rc) {
printf("no events\n");
continue;
}
else {
printf("Sending\n");
}
short sEvent = pollItem[0].revents & pollItem[0].events;
if (sEvent & ZMQ_POLLOUT) {
zmq_msg_t msg;
rc = zmq_msg_init_size (&msg, sizeof(Info));
assert (rc == 0);
string str = "pub number: " + to_string(request++);
Info info;
info.len = str.size();
memcpy (info.content, str.c_str(), info.len);
info.content[info.len] = '\0';
memcpy (zmq_msg_data (&msg), &info, sizeof(Info));
auto len = zmq_msg_send (&msg, responder, ZMQ_DONTWAIT);
if (-1 == len) {
printf("Send ErrorInfo: %s\n", zmq_strerror(zmq_errno()));
}
else {
printf("send ret %d, msg_size %d\n", len, sizeof(Info));
}
zmq_msg_close(&msg);
}
}
}
Client
void sub()
{
printf ("Connecting to hello world server…\n");
void *context = zmq_ctx_new ();
void *subscriber = zmq_socket (context, ZMQ_SUB);
if (0 != zmq_connect (subscriber, SOCKET_CHANNEL)) {
printf("connect failed \n");
}
if (zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0)) {
printf("zmq_setsockopt fail\n");
}
const int MSG_LENGTH = 1024;
unsigned char MSG[MSG_LENGTH];
zmq_pollitem_t pollItem[] = { {subscriber, 0, ZMQ_POLLIN, 0} };
long timeout = 1000;
while (1) {
int rc = zmq_poll(pollItem, 1, timeout);
if (rc < 0) {
printf("poll failed: %s\n", zmq_strerror(zmq_errno()));
}
else if (0 == rc) {
printf("no events\n");
continue;
}
else {
printf("Recving\n");
}
short event = pollItem[0].revents & pollItem[0].events;
if (event & ZMQ_POLLIN) {
zmq_msg_t msg_r;
zmq_msg_init(&msg_r);
if (-1 != zmq_msg_recv(&msg_r, subscriber, ZMQ_DONTWAIT)) {
unsigned int length = zmq_msg_size(&msg_r);
memset(MSG, 0, MSG_LENGTH);
memcpy(MSG, zmq_msg_data(&msg_r), length);
Info* info = reinterpret_cast<Info*>(MSG);
printf("Received Msg: %d, %s\n", info->len, info->content);
}
else {
printf("Recv ErrorInfo: %s\n", zmq_strerror(zmq_errno()));
}
zmq_msg_close(&msg_r);
}
}
zmq_close (subscriber);
zmq_ctx_destroy (context);
}