private static int SendMsg(SocketBase s, Msg msg, SendRecieveOptions flags) { int sz = MsgSize(msg); bool rc = s.Send(msg, flags); if (!rc) return -1; return sz; }
public static bool proxy(SocketBase frontend_, SocketBase backend_, SocketBase capture_) { // The algorithm below assumes ratio of requests and replies processed // under full load to be 1:1. // TODO: The current implementation drops messages when // any of the pipes becomes full. bool success = true; int rc; long more; Msg msg; PollItem[] items = new PollItem[2]; items[0] = new PollItem (frontend_, ZMQ.ZmqPollin ); items[1] = new PollItem (backend_, ZMQ.ZmqPollin ); Selector selector; try { selector = Selector.open(); } catch (IOException e) { throw new ZError.IOException(e); } try { while (!Thread.currentThread().isInterrupted()) { // Wait while there are either requests or replies to process. rc = ZMQ.zmq_poll (selector, items, -1); if (rc < 0) return false; // Process a request. if (items [0].isReadable()) { while (true) { msg = frontend_.Recv (0); if (msg == null) { return false; } more = frontend_.getsockopt (ZMQ.ZMQ_RCVMORE); if (more < 0) return false; // Copy message to capture socket if any if (capture_ != null) { Msg ctrl = new Msg (msg); success = capture_.Send (ctrl, more > 0 ? ZMQ.ZMQ_SNDMORE: 0); if (!success) return false; } success = backend_.Send (msg, more > 0 ? ZMQ.ZMQ_SNDMORE: 0); if (!success) return false; if (more == 0) break; } } // Process a reply. if (items [1].isReadable()) { while (true) { msg = backend_.Recv (0); if (msg == null) { return false; } more = backend_.getsockopt (ZMQ.ZMQ_RCVMORE); if (more < 0) return false; // Copy message to capture socket if any if (capture_ != null) { Msg ctrl = new Msg (msg); success = capture_.Send (ctrl, more > 0 ? ZMQ.ZMQ_SNDMORE: 0); if (!success) return false; } success = frontend_.Send (msg, more > 0 ? ZMQ.ZMQ_SNDMORE: 0); if (!success) return false; if (more == 0) break; } } } } finally { try { selector.close(); } catch (Exception e) { } } return true; }
public bool Write(SocketBase s) { int size = 4 + 1 + m_addr.Length + 1; // event + len(addr) + addr + flag if (m_flag == ValueInteger) size += 4; else if (m_flag == ValueChannel) { size += SizeOfIntPtr; } int pos = 0; ByteArraySegment buffer = new byte[size]; buffer.PutInteger((int)m_monitorEvent, pos); pos += 4; buffer[pos++] = (byte)m_addr.Length; // was not here originally buffer.PutString(m_addr, pos); pos += m_addr.Length; buffer[pos++] = ((byte)m_flag); if (m_flag == ValueInteger) { buffer.PutInteger((int) m_arg, pos); } else if (m_flag == ValueChannel) { if (SizeOfIntPtr == 4) { buffer.PutInteger(((Socket)m_arg).Handle.ToInt32(), pos); } else { buffer.PutLong(((Socket)m_arg).Handle.ToInt64(), pos); } } Msg msg = new Msg((byte[])buffer); return s.Send(msg, 0); }