public bool sendAndReceive(ref NetMQ.Msg req_msg, ref NetMQ.Msg resp_msg) { if (socket == null) { reconnect(); } StdMessage m = new StdMessage(req_msg.Data[1], req_msg.Data[2]); NetMQ.Msg copy = new NetMQ.Msg(); bool ok = false; for (uint i = 0; i < retries; i++) { copy.Copy(ref req_msg); // send if (!socket.TrySend(ref copy, TimeSpan.FromMilliseconds(min_trysend_ms), false)) { ok = false; UnityEngine.Debug.Log("ReliableExternalClient: could not send"); break; //TODO: clear enqueued messages when server is offline } //UnityEngine.Debug.Log("ReliableExternalClient: request sent " + m.to_string()); // receive if (socket.TryReceive(ref resp_msg, timeout)) { ok = true; // UnityEngine.Debug.Log("ReliableExternalClient: response received " //+ new StdMessage(resp_msg.Data[1], resp_msg.Data[2]).to_string()); break; } //UnityEngine.Debug.Log(String.Format("ReliableExternalClient: no response from server {0}. Retrying", srvAddress)); reconnect(); } if (!ok) { UnityEngine.Debug.Log(String.Format("ReliableExternalClient: server {0} seems to be offline. Abandoning", srvAddress)); } copy.Close(); socket.Dispose(); //call Dispose on all sockets before cleanup the netmq context socket.Close(); socket = null; if (socket == null) { UnityEngine.Debug.Log("ReliableExternalClient: socket closed and null"); } return(ok); }
public IMessage ReceiveMessage(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { var frames = new List <byte[]>(); var msg = new Msg(); msg.InitEmpty(); try { do { if (socket.TryReceive(ref msg, ReceiveWaitTimeout)) { frames.Add(msg.Data); } } while (msg.HasMore); if (frames.Count > 0) { ReceiveRate?.Increment(); return(Message.FromMultipartMessage(new MultipartMessage(frames))); } } finally { msg.Close(); } } return(null); }
public static NetworkMessageBase ReceiveNetworkMsg(this NetMQSocket socket, TimeSpan timeout) { var inMsg = new Msg(); inMsg.InitEmpty(); try { socket.TryReceive(ref inMsg, timeout); } catch (Exception) { return(null); } var str = inMsg.Size > 0 ? Encoding.GetString(inMsg.Data, 0, inMsg.Size) : string.Empty; inMsg.Close(); if (!string.IsNullOrWhiteSpace(str)) { Debug.WriteLine("[R <<<] " + str); } return(NetworkMessageCoding.Decode(str)); }
protected virtual void _Receive() { Msg msg = new Msg(); msg.InitEmpty(); bool result = false; List <Msg> address_buffer = new List <Msg>(); do { result = socket.TryReceive(ref msg, TimeSpan.FromMilliseconds((int)time_out_read_ms)); //non-block-100hz if (result && msg.HasMore == false && msg.Data.Length > 0) { Message packet = null; using (System.IO.MemoryStream ms = new System.IO.MemoryStream(msg.Data)) { packet = Serializer.Deserialize <Message>(ms); } if (packet != null) { bytes_receive.Bytes += (ulong)msg.Data.Length; if (address_buffer.Count == 1) { //address buffer stored the router address; Router address has two parts, first is empty, second is the address //So we select the second Msg of it Msg m = address_buffer[0]; if (m.Data.Length > 0) { packet.header.zmq_router_address = m.Data; } } reportData(packet); } else { reportLog("Ivalid packet", LogType.ERROR, section); } } else if (result && msg.HasMore) { address_buffer.Add(msg); } } while (result && msg.HasMore); }