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