public PacketHandler(byte[] _packet) { // try handler packet if (!handlerPacket(_packet)) { invalidData = ""; for (int i = 0; i < _packet.Length; i++) invalidData += _packet[i] + " "; _format = new PacketFormat("???"); _packet = new byte[] { }; } }
private void Creator(PacketFormat format, byte[] data) { // create format byte[] packetFormat = formatingPacket(format.getByteArrayFormat); // create data byte[] packetData = formatingPacket(data); // setting length of packet _data = new byte[packetFormat.Length + packetData.Length]; // copy format to packet Array.Copy(packetFormat, _data, packetFormat.Length); // copy data to packet Array.Copy(packetData, 0, _data, packetFormat.Length, packetData.Length); }
/// <summary> /// Create data formated with a format /// </summary> /// <param name="format">DarkKnight.Data.PacketFormat object</param> /// <param name="data">array of bytes data</param> public PacketCreator(PacketFormat format, byte[] data) { Creator(format, data); }
/// <summary> /// Here we filter the received packet in bytes to turn into a readable package for the Packet class. /// We took the package format and also took the given package. /// </summary> /// <returns>true if packet is handled with success</returns> private bool handlerPacket(byte[] packet) { int lengthFormat = 0; int lengthFormatPosition = 0; do { lengthFormat += packet[lengthFormatPosition]; lengthFormatPosition++; if (lengthFormatPosition >= packet.Length || lengthFormat > packet.Length) return false; } while (packet[lengthFormatPosition] > 0); int lengthData = 0; int lengthDataPosition = lengthFormat + lengthFormatPosition + 1; if (lengthDataPosition >= packet.Length) return false; do { lengthData += packet[lengthDataPosition]; lengthDataPosition++; if (lengthDataPosition >= packet.Length || lengthData > packet.Length) return false; } while (packet[lengthDataPosition] > 0); int lengthDataLengthInformation = lengthDataPosition - (lengthFormat + lengthFormatPosition + 1); int totalDataLength = lengthData + lengthFormat + lengthFormatPosition + lengthDataLengthInformation + 2; if (packet.Length < totalDataLength) return false; try { byte[] format = new byte[lengthFormat]; _packet = new byte[lengthData]; Array.Copy(packet, lengthFormatPosition + 1, format, 0, lengthFormat); Array.Copy(packet, lengthDataPosition + 1, _packet, 0, lengthData); _format = new PacketFormat(Encoding.UTF8.GetString(format)); packetHandled.Add((Packet)this.MemberwiseClone()); if (packet.Length == totalDataLength) return true; byte[] morePacket = new byte[packet.Length - totalDataLength]; Array.Copy(packet, totalDataLength, morePacket, 0, packet.Length - totalDataLength); return handlerPacket(morePacket); } catch { return false; } }
/// <summary> /// Send a array of bytes 8-bits mapped with format to the server /// </summary> /// <param name="format">DarkKnight.client.PacketFormat object</param> /// <param name="toSend">the int to send</param> public void Send(PacketFormat format, byte[] toSend) { SendPacket(new PacketCreator(format, toSend)); }
/// <summary> /// Send a mapped with format to the server /// </summary> /// <param name="format">DarkKnight.client.PacketFormat object</param> public void Send(PacketFormat format) { Send(format, new byte[] { }); }
/// <summary> /// Send a UTF8 String mapped with format to the server /// </summary> /// <param name="format">DarkKnight.client.PacketFormat object</param> /// <param name="toSend">the string to send</param> public void Send(PacketFormat format, string toSend) { Send(format, Encoding.UTF8.GetBytes(toSend)); }