public static void SendPacket(UdpClient client, IPEndPoint endPoint, ChunkConstruct packet) { if (packet.DataSize == 0) { return; } Debug.Assert((packet.Token & ~TokenHelper.TokenMask) == 0, "token out of range"); var buffer = new byte[MaxPacketSize]; var compressedSize = -1; if (!packet.Flags.HasFlag(PacketFlags.Control)) { compressedSize = Huffman.Compress(packet.Data, 0, packet.DataSize, buffer, PacketHeaderSize, MaxPayload); } int finalSize; if (compressedSize > 0 && compressedSize < packet.DataSize) { finalSize = compressedSize; packet.Flags |= PacketFlags.Compression; } else { finalSize = packet.DataSize; Buffer.BlockCopy(packet.Data, 0, buffer, PacketHeaderSize, packet.DataSize); packet.Flags &= ~PacketFlags.Compression; } finalSize += PacketHeaderSize; buffer[0] = (byte)((((int)packet.Flags << 2) & 0xfc) | ((packet.Ack >> 8) & 0x03)); // flags and ack buffer[1] = (byte)((packet.Ack) & 0xff); buffer[2] = (byte)((packet.NumChunks) & 0xff); buffer[3] = (byte)((packet.Token >> 24) & 0xff); buffer[4] = (byte)((packet.Token >> 16) & 0xff); buffer[5] = (byte)((packet.Token >> 8) & 0xff); buffer[6] = (byte)((packet.Token) & 0xff); client.Send(buffer, finalSize, endPoint); }
public static void SendPacket(UdpClient udpClient, IPEndPoint endPoint, NetworkChunkConstruct packet) { var buffer = new byte[MAX_PACKET_SIZE]; var headerSize = PACKET_HEADER_SIZE_WITHOUT_TOKEN; var compressedSize = -1; if (packet.Flags.HasFlag(PacketFlags.TOKEN)) { headerSize = PACKET_HEADER_SIZE; packet.Token.ToByteArray(buffer, 3); } if (!packet.Flags.HasFlag(PacketFlags.CONTROL)) { compressedSize = _huffman.Compress(packet.Data, 0, packet.DataSize, buffer, headerSize, buffer.Length - headerSize); } //compressedSize = _huffman.Compress(packet.Data, 0, packet.DataSize, // buffer, PACKET_HEADER_SIZE, buffer.Length - PACKET_HEADER_SIZE); int finalSize; if (compressedSize > 0 && compressedSize < packet.DataSize) { finalSize = compressedSize; packet.Flags |= PacketFlags.COMPRESSION; } else { finalSize = packet.DataSize; Buffer.BlockCopy(packet.Data, 0, buffer, headerSize, packet.DataSize); packet.Flags &= ~PacketFlags.COMPRESSION; } finalSize += headerSize; buffer[0] = (byte)((((int)packet.Flags << 2) & 0xfc) | ((packet.Ack >> 8) & 0x3)); buffer[1] = (byte)(packet.Ack & 0xff); buffer[2] = (byte)packet.NumChunks; udpClient.Send(buffer, finalSize, endPoint); }