38
38
cdef inline int _relay(void *insocket_, void *outsocket_, void *sidesocket_,
39
39
zmq_msg_t msg, zmq_msg_t side_msg, zmq_msg_t id_msg,
40
40
bint swap_ids) nogil:
43
42
cdef int64_t flag_2
50
49
if ZMQ_VERSION_MAJOR < 3:
51
50
flagsz = sizeof (int64_t)
53
SNDLABEL = ZMQ_SNDMORE
55
53
flagsz = sizeof (int)
57
SNDLABEL = ZMQ_SNDLABEL
58
if ZMQ_VERSION_MAJOR == 3:
59
# in 3.x, ROUTER prefix is 2.x-style with SNDMORE, rather than
60
# new-style with SNDLABEL
61
rc = zmq_getsockopt (outsocket_, ZMQ_TYPE, flag_ptr, &flagsz)
62
# This will never actually happen until LIBZMQ-249 is resolved:
63
if flag_3 == ZMQ_ROUTER:
64
SNDLABEL = ZMQ_SNDMORE
68
56
if swap_ids:# both router, must send second identity first
69
57
# recv two ids into msg, id_msg
70
58
rc = zmq_recvmsg (insocket_, &msg, 0)
71
if ZMQ_VERSION_MAJOR == 3:
72
# temporary workaround for LIBZMQ-249
73
rc = zmq_getsockopt (outsocket_, ZMQ_RCVLABEL, flag_ptr, &flagsz)
75
SNDLABEL = ZMQ_SNDLABEL
77
SNDLABEL = ZMQ_SNDMORE
78
59
rc = zmq_recvmsg (insocket_, &id_msg, 0)
80
61
# send second id (id_msg) first
81
62
#!!!! always send a copy before the original !!!!
82
63
rc = zmq_msg_copy(&side_msg, &id_msg)
83
rc = zmq_sendmsg (outsocket_, &side_msg, SNDLABEL)
64
rc = zmq_sendmsg (outsocket_, &side_msg, ZMQ_SNDMORE)
84
65
rc = zmq_sendmsg (sidesocket_, &id_msg, ZMQ_SNDMORE)
85
66
# send first id (msg) second
86
67
rc = zmq_msg_copy(&side_msg, &msg)
87
rc = zmq_sendmsg (outsocket_, &side_msg, SNDLABEL)
68
rc = zmq_sendmsg (outsocket_, &side_msg, ZMQ_SNDMORE)
88
69
rc = zmq_sendmsg (sidesocket_, &msg, ZMQ_SNDMORE)
101
82
flags |= ZMQ_SNDMORE
102
rc = zmq_getsockopt (insocket_, ZMQ_RCVLABEL, flag_ptr, &flagsz)
104
flags |= ZMQ_SNDLABEL
83
# LABEL has been removed:
84
# rc = zmq_getsockopt (insocket_, ZMQ_RCVLABEL, flag_ptr, &flagsz)
86
# flags |= ZMQ_SNDLABEL
105
87
# assert (rc == 0)
107
89
rc = zmq_msg_copy(&side_msg, &msg)