public override void Send(IWriteMessage msg, DeliveryMethod deliveryMethod) { if (!isActive) { return; } byte[] buf = new byte[msg.LengthBytes + 4]; buf[0] = (byte)deliveryMethod; byte[] bufAux = new byte[msg.LengthBytes]; bool isCompressed; int length; msg.PrepareForSending(ref bufAux, out isCompressed, out length); buf[1] = (byte)(isCompressed ? PacketHeader.IsCompressed : PacketHeader.None); buf[2] = (byte)(length & 0xff); buf[3] = (byte)((length >> 8) & 0xff); Array.Copy(bufAux, 0, buf, 4, length); Facepunch.Steamworks.Networking.SendType sendType; switch (deliveryMethod) { case DeliveryMethod.Reliable: case DeliveryMethod.ReliableOrdered: //the documentation seems to suggest that the Reliable send type //enforces packet order (TODO: verify) sendType = Facepunch.Steamworks.Networking.SendType.Reliable; break; default: sendType = Facepunch.Steamworks.Networking.SendType.Unreliable; break; } if (length + 8 >= MsgConstants.MTU) { DebugConsole.Log("WARNING: message length comes close to exceeding MTU, forcing reliable send (" + length.ToString() + " bytes)"); sendType = Facepunch.Steamworks.Networking.SendType.Reliable; } heartbeatTimer = 5.0; bool successSend = SteamManager.Instance.Networking.SendP2PPacket(hostSteamId, buf, length + 4, sendType); if (!successSend) { if (sendType != Facepunch.Steamworks.Networking.SendType.Reliable) { DebugConsole.Log("WARNING: message couldn't be sent unreliably, forcing reliable send (" + length.ToString() + " bytes)"); sendType = Facepunch.Steamworks.Networking.SendType.Reliable; successSend = Steam.SteamManager.Instance.Networking.SendP2PPacket(hostSteamId, buf, length + 4, sendType); } if (!successSend) { DebugConsole.ThrowError("Failed to send message to remote peer! (" + length.ToString() + " bytes)"); } } }
public override void Send(IWriteMessage msg, DeliveryMethod deliveryMethod) { if (!isActive) { return; } byte[] buf = new byte[msg.LengthBytes + 4]; buf[0] = (byte)deliveryMethod; byte[] bufAux = new byte[msg.LengthBytes]; bool isCompressed; int length; msg.PrepareForSending(ref bufAux, out isCompressed, out length); buf[1] = (byte)(isCompressed ? PacketHeader.IsCompressed : PacketHeader.None); buf[2] = (byte)(length & 0xff); buf[3] = (byte)((length >> 8) & 0xff); Array.Copy(bufAux, 0, buf, 4, length); Steamworks.P2PSend sendType; switch (deliveryMethod) { case DeliveryMethod.Reliable: case DeliveryMethod.ReliableOrdered: //the documentation seems to suggest that the Reliable send type //enforces packet order (TODO: verify) sendType = Steamworks.P2PSend.Reliable; break; default: sendType = Steamworks.P2PSend.Unreliable; break; } if (length + 8 >= MsgConstants.MTU) { DebugConsole.Log("WARNING: message length comes close to exceeding MTU, forcing reliable send (" + length.ToString() + " bytes)"); sendType = Steamworks.P2PSend.Reliable; } heartbeatTimer = 5.0; #if DEBUG CoroutineManager.InvokeAfter(() => { if (GameMain.Client == null) { return; } if (Rand.Range(0.0f, 1.0f) < GameMain.Client.SimulatedLoss && sendType != Steamworks.P2PSend.Reliable) { return; } int count = Rand.Range(0.0f, 1.0f) < GameMain.Client.SimulatedDuplicatesChance ? 2 : 1; for (int i = 0; i < count; i++) { Send(buf, length + 4, sendType); } }, GameMain.Client.SimulatedMinimumLatency + Rand.Range(0.0f, GameMain.Client.SimulatedRandomLatency)); #else Send(buf, length + 4, sendType); #endif }