ZMQ_ROUTER类型的套接字是请求/回复模式的一种升级。
当ZMQ_ROUTER收到一个消息的时候,会自动在消息前面添加一帧,这一帧用来识别发送端的地址。
当发送一个消息的时候,需要先发送一帧对端的地址,然后再发送消息,如果目的地址指向的对端不存在了,这个消息就会被丢弃。
对端的地址默认情况下由ZMQ来产生一个唯一标识UUID。
ROUTER源码:
//
// Shows how to handle Ctrl-C
void dump_msg(const void * data, int size)
{
unsigned char * ptr = (unsigned char *)data;
printf ("[%03d] ", size);
int i = 0;
for (i = 0; i < size; i++)
printf ("%02X", ptr[i]);
printf ("\n");
}
int main (void)
{
void *context = zmq_ctx_new();
void *router = zmq_socket (context, ZMQ_ROUTER);
zmq_bind (router, "tcp://*:5555");
int ret;
zmq_msg_t address;
zmq_msg_t data;
while (1)
{
zmq_msg_init(&address);
zmq_msg_init(&data);
/*接收到的第一帧表示对端的地址*/
ret = zmq_msg_recv (&address, router, 0);
dump_msg(zmq_msg_data(&address), ret);
/*从第二帧开始才是对端发来的消息*/
ret = zmq_msg_recv (&data, router, 0);
dump_msg(zmq_msg_data(&data), ret);
/*发送的时候,先发一帧对端的地址*/
zmq_msg_send(&address, router, ZMQ_SNDMORE);
/*然后再发送给对端消息*/
memcpy(zmq_msg_data(&data), "world", strlen("world"));
zmq_msg_send(&data, router, 0);
zmq_msg_close(&address);
zmq_msg_close(&data);
}
zmq_close (router);
zmq_ctx_destroy (context);
return 0;
}
DEALER可以任意读写,不需要额外的地址帧,当有多个对端的时候,循环给单个对端发送消息。(注意:不是群发消息,与PUB不同)。
DEALER源码:
void dump_msg(const void * data, int size)
{
unsigned char * ptr = (unsigned char *)data;
printf ("[%03d] ", size);
int i = 0;
for (i = 0; i < size; i++)
printf ("%02X", ptr[i]);
printf ("\n");
}
int main (void)
{
void *context = zmq_ctx_new();
void *dealer = zmq_socket (context, ZMQ_DEALER);
zmq_connect (dealer, "tcp://127.0.0.1:5555");
int ret;
char buf[256] = "hello";
while (1)
{
/*发送一帧,不需要发送地址帧*/
zmq_send (dealer, buf, strlen(buf), 0);
sleep(1);
/*接收一帧,不会接收到地址帧*/
ret = zmq_recv (dealer, buf, sizeof(buf), 0);
dump_msg(buf, ret);
}
zmq_close (dealer);
zmq_ctx_destroy(context);
return 0;
}