Beispiel #1
0
    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);
    }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
            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);
            }