コード例 #1
0
 /// <summary>
 /// <inheritdoc/>
 /// </summary>
 /// <param name="data"></param>
 /// <returns></returns>
 public RNetMessage?Deserialize(byte[] data, IPEndPoint remoteEndPoint, out EDeserializeError error)
 {
     error = EDeserializeError.None;
     try
     {
         JObject json = JObject.Parse(ASCIIEncoding.UTF8.GetString(data));
         if (json["msgId"]?.ToObject <int?>() == null)
         {
             var message = new RNetMessage(
                 json["data"]?.ToObject <byte[]>(),
                 json["tId"]?.ToObject <int>(),
                 remoteEndPoint,
                 RQoSType.Realiable
                 );
             return(message);
         }
         else
         {
             var message = new RNetMessage(
                 json["data"]?.ToObject <byte[]>(),
                 json["tId"]?.ToObject <int>(),
                 remoteEndPoint,
                 (RQoSType)json["qos"] !.ToObject <int>()
                 );
             return(message);
         }
     }
     catch
     {
         error = EDeserializeError.NotComplete;
         return(null);
     }
 }
コード例 #2
0
        public RNetMessage?Deserialize(byte[] data, IPEndPoint remoteEndPoint, out EDeserializeError error)
        {
            error = EDeserializeError.None;
            int DataSize = data.Length;

            long?    TransactionId = null;
            RQoSType type          = RQoSType.Realiable;

            int readCursor = 1;//byte[0] = 1 -> RNetMessage

            if (data[readCursor++] == 1)
            {
                TransactionId = BitConverter.ToInt64(data, readCursor);
                readCursor   += sizeof(long);
            } //else TransactionId = null

            if (readCursor > DataSize)
            {
                error = EDeserializeError.NotComplete;
                return(null);
            }

            type = (RQoSType)data[readCursor++];

            if (readCursor > DataSize)
            {
                error = EDeserializeError.NotComplete;
                return(null);
            }

            int data_length = BitConverter.ToInt32(data, readCursor);

            readCursor += sizeof(int);

            if (readCursor + data_length > DataSize)
            {
                error = EDeserializeError.NotComplete;
                return(null);
            }

            byte[] rec_data = new byte[data_length];
            Array.Copy(data, readCursor, rec_data, 0, data_length);

            return(new RNetMessage(rec_data, TransactionId, remoteEndPoint, type));
        }
コード例 #3
0
        protected void ReceivingTask(CancellationToken cancellationToken)
        {
            while (!cancellationToken.IsCancellationRequested)
            {
                var data = new byte[_settings.BufferSize];
                //var data = new byte[4096];

                int numOfReceivedBytes = 0;
                try
                {
                    numOfReceivedBytes = _socket !.ReceiveFrom(data, 0, _settings.BufferSize, SocketFlags.None, ref RemoteEndPoint);
                }
                catch (SocketException ex)
                {
                    if (ex.ErrorCode == 10004)
                    {
                        continue;
                    }
                    _logger?.WriteError(new LogInfo("error while receiving data (socket): (" + ex.ErrorCode + ") " + ex.Message));
                    continue;
                }
                catch (Exception ex)
                {
                    _logger?.WriteError(new LogInfo("error while receiving data: " + ex.Message));
                    continue;
                }

                if (numOfReceivedBytes > 0)
                {
                    UpdateReceiveStatistics(numOfReceivedBytes);
                    if (_serializer.IsRequest(data))
                    {
                        RNetMessage?      msg = null;
                        EDeserializeError deserialize_error = EDeserializeError.None;
                        try
                        {
                            msg = _serializer.Deserialize(data, (IPEndPoint)RemoteEndPoint, out deserialize_error);
                        }
                        catch (Exception ex)
                        {
                            _logger?.WriteError(new LogInfo("Serializing of RNetMessage failed: " + ex.Message));
                            continue;
                        }

                        if (deserialize_error != EDeserializeError.None || msg == null)
                        {
                            _logger?.WriteError(new LogInfo("Got incomplete RNetMessage!"));
                            TotalPacketsIncomplete++;
                            continue;
                        }
                        else if (msg.QoSType == RQoSType.Internal)
                        {
                            //Handle internal Messages instant
                            _pendingACKMessages.Enqueue(new RReliableNetMessageACK(msg.TransactionId !.Value, msg.RemoteEndPoint));
                            HandleIncommingMessages(msg);
                        }
                        else
                        {
                            if (msg.QoSType == RQoSType.Realiable || msg.QoSType == RQoSType.Internal)
                            {
                                //Send ACK Message
                                _pendingACKMessages.Enqueue(new RReliableNetMessageACK(msg.TransactionId !.Value, msg.RemoteEndPoint));
                            }

                            if (_settings.HandleMessagesInMainThread == true)
                            {
                                _incomingMsgQueue.Enqueue(msg);
                            }
                            else
                            {
                                HandleIncommingMessages(msg);
                            }
                        }
                    }
                    else if (_serializer.IsMessageACK(data))
                    {
                        RReliableNetMessageACK?ackMsg = null;
                        try
                        {
                            ackMsg = _serializer.DeserializeACKMessage(data, RemoteEndPoint);
                        }
                        catch (Exception ex)
                        {
                            _logger?.WriteError(new LogInfo("Serializing of ACKRNetMessage failed: " + ex.Message));
                            continue;
                        }
                        if (ackMsg != null)
                        {
                            if (!RemoveSentMessageFromUnacknowledgedMsgQueue(ackMsg))
                            {
                                var errorMsg = "Can't remove non existing network message from unacknowledged message list. TransactionId: " + ackMsg.TransactionId;
                                _logger?.WriteInfo(new LogInfo(errorMsg));
                            }
                        }
                    }
                }
            }
        }