Beispiel #1
0
        public void Send(StarNetPacket packet, IPEndPoint destination)
        {
            var memory = new MemoryStream();
            var stream = new BinaryWriter(memory);

            stream.Write(packet.GetType().Name);
            stream.Write((byte)packet.Flags);
            if (packet.AssignTransactionId)
            {
                packet.Transaction = GetTransactionNumber();
            }
            stream.Write(packet.Transaction);
            stream.Write(DateTime.UtcNow.Ticks);
            packet.Write(stream);
            var payload = new byte[memory.Position];

            memory.Seek(0, SeekOrigin.Begin);
            memory.Read(payload, 0, payload.Length);
            var signature = CryptoProvider.SignMessage(payload);

            memory.Write(signature, 0, signature.Length);
            payload = new byte[memory.Position];
            memory.Seek(0, SeekOrigin.Begin);
            memory.Read(payload, 0, payload.Length);
            packet.Destination    = destination;
            packet.ScheduledRetry = DateTime.UtcNow.AddSeconds(10);
            if (packet.Retries == 0 && (packet.Flags & MessageFlags.ConfirmationRequired) > 0)
            {
                lock (NetworkLock) PacketRetryList.Add(packet);
            }
            NetworkClient.Send(payload, payload.Length, destination);
        }
Beispiel #2
0
 private void HandleConfirmation(StarNetPacket packet)
 {
     lock (NetworkLock)
     {
         for (int i = 0; i < PacketRetryList.Count; i++)
         {
             if (PacketRetryList[i].Transaction == packet.Transaction)
             {
                 PacketRetryList[i].OnConfirmationReceived();
                 PacketRetryList.RemoveAt(i);
                 break;
             }
         }
     }
 }
Beispiel #3
0
 private void DoRetries(object discarded)
 {
     lock (NetworkLock)
     {
         for (int i = 0; i < PacketRetryList.Count; i++)
         {
             if (PacketRetryList[i].ScheduledRetry < DateTime.Now)
             {
                 var packet = PacketRetryList[i];
                 PacketRetryList.RemoveAt(i--);
                 packet.Retries++;
                 Send(packet, packet.Destination);
             }
         }
     }
 }