/// <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); } }
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)); }
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)); } } } } } }