コード例 #1
0
        private int CalculateSize(IWriteablePacket packet)
        {
            var writer = new CountingPacketWriter();

            packet.Write(writer);
            return(writer.Size);
        }
コード例 #2
0
        private void WritePacketToPipe(IWriteablePacket packet)
        {
            var dataSize   = CalculateSize(packet) + CountingPacketWriter.GetVarIntSize(packet.Id);
            var packetSize = dataSize + CountingPacketWriter.GetVarIntSize(dataSize);

            var writer = _writerFactory.CreateWriter(_writer.GetMemory(packetSize));

            writer.WriteVarInt(dataSize);
            writer.WriteVarInt(packet.Id);
            packet.Write(writer);

            _writer.Advance(packetSize);
            _metrics.Measure.Histogram.Update(MetricsRegistry.WritePacketSize, packetSize);
        }
コード例 #3
0
ファイル: BroadcastQueue.cs プロジェクト: Tobi406/SM3
 public void Broadcast(IWriteablePacket packet)
 {
     _metrics.Measure.Meter.Mark(MetricsRegistry.BroadcastPackets);
     for (var index = 0; index < _packetQueues.Count; index++)
     {
         var reference = _packetQueues[index];
         // TODO: it might be worth caching some of this.
         // it's not perfectly valid though
         // I could make a separate IConnectionState
         // and fallback if any property is accessed.
         // but I'm not sure the performance impact...
         if (reference.TryGetTarget(out var queue))
         {
             queue.Write(packet);
         }
         else
         {
             _packetQueues.Remove(reference);
             index--;
         }
     }
 }
コード例 #4
0
 public void WriteImmediate(IWriteablePacket packet)
 {
     WritePacketToPipe(packet);
     _writer.FlushAsync().GetAwaiter().GetResult();
 }
コード例 #5
0
 public void Write(IWriteablePacket packet)
 {
     _toWrite.Enqueue(packet);
 }