public unsafe bool SendPart() { byte *block = stackalloc byte[m_blockSize + 1]; // One more byte for header block[0] = MyMultipartMessage.DATA_HEADER; IntPtr dataPtr = new IntPtr(&block[1]); if (m_currentPart < m_blockCount - 1) { Marshal.Copy(m_data, m_currentPart * m_blockSize, dataPtr, m_blockSize); Peer2Peer.SendPacket(m_sendTo, block, m_blockSize + 1, P2PMessageEnum.Reliable, m_channel); m_currentPart++; return(true); } else if (m_currentPart == m_blockCount - 1) { int basePos = m_currentPart * m_blockSize; Marshal.Copy(m_data, basePos, dataPtr, m_dataLength - basePos); Peer2Peer.SendPacket(m_sendTo, block, m_dataLength - basePos + 1, P2PMessageEnum.Reliable, m_channel); m_currentPart++; return(false); } else { return(false); } }
protected void SendControlMessage <T>(ulong user, ref T message) where T : struct { ITransportCallback handler; MyControlMessageEnum messageEnum; m_controlMessageTypes.TryGetValue(typeof(T), out messageEnum); m_controlMessageHandlers.TryGetValue((int)messageEnum, out handler); var callback = ((MyControlMessageCallback <T>)handler); if (!MySyncLayer.CheckSendPermissions(user, callback.Permission)) { return; } m_controlSendStream.Position = 0; m_controlSendStream.WriteUShort((ushort)messageEnum); callback.Write(m_controlSendStream, ref message); if (!Peer2Peer.SendPacket(user, m_controlSendStream.Data, (int)m_controlSendStream.Position, P2PMessageEnum.Reliable, MyMultiplayer.ControlChannel)) { System.Diagnostics.Debug.Fail("P2P packet not sent"); } // Peer2Peer.SendPacket(user, (byte*)&msg, sizeof(ControlMessageStruct), P2PMessageEnum.Reliable, MyMultiplayer.ControlChannel); }
public unsafe bool SendPart(int part) { byte *block = stackalloc byte[m_blockSize + 5]; // Five more bytes for header and index block[0] = MyMultipartMessage.DATA_HEADER; ((int *)(&block[1]))[0] = part; IntPtr dataPtr = new IntPtr(&block[5]); if (part < m_blockCount - 1) { #if XB1 System.Diagnostics.Debug.Assert(false); // No Marshal.Copy on Xbox One #else // !XB1 Marshal.Copy(m_data, part * m_blockSize, dataPtr, m_blockSize); #endif // !XB1 Peer2Peer.SendPacket(m_sendTo, block, m_blockSize + 5, P2PMessageEnum.Unreliable, m_channel); return(true); } else if (part == m_blockCount - 1) { int basePos = part * m_blockSize; #if XB1 System.Diagnostics.Debug.Assert(false); // No Marshal.Copy on Xbox One #else // !XB1 Marshal.Copy(m_data, basePos, dataPtr, m_dataLength - basePos); #endif // !XB1 Peer2Peer.SendPacket(m_sendTo, block, m_dataLength - basePos + 5, P2PMessageEnum.Unreliable, m_channel); return(false); } else { return(false); } }
static void SendHandler(ulong remoteUser, byte[] data, int byteCount, P2PMessageEnum msgType, int channel) { if (!Peer2Peer.SendPacket(remoteUser, data, byteCount, msgType, channel)) { System.Diagnostics.Debug.Fail("P2P packet send fail"); } }
public static unsafe bool SendPreemble(ulong sendTo, int channel) { bool ok = true; byte data = PREEMBLE_HEADER; ok &= Peer2Peer.SendPacket(sendTo, &data, 1, P2PMessageEnum.Reliable, channel); return(ok); }
unsafe private void SendHeader() { int headerSize = sizeof(byte) + sizeof(int) + sizeof(int) + sizeof(int); byte *block = stackalloc byte[headerSize]; // First byte is header block[0] = MyMultipartMessage.START_HEADER; ((int *)(&block[1]))[0] = m_blockCount; ((int *)(&block[1]))[1] = m_blockSize; ((int *)(&block[1]))[2] = m_dataLength; Peer2Peer.SendPacket(m_sendTo, block, headerSize, P2PMessageEnum.ReliableWithBuffering, m_channel); }
void SendHandler(ulong remoteUser, byte[] data, int byteCount, P2PMessageEnum msgType, int channel) { if (msgType == P2PMessageEnum.ReliableWithBuffering) { m_pendingFlushes.Add(remoteUser); } ByteCountSent += byteCount; if (!Peer2Peer.SendPacket(remoteUser, data, byteCount, msgType, channel)) { System.Diagnostics.Debug.Fail("P2P packet send fail"); } }
public unsafe void Tick() { foreach (var steamId in m_pendingFlushes) { byte data = 0; if (!Peer2Peer.SendPacket(steamId, &data, 0, P2PMessageEnum.Reliable, m_channel)) { System.Diagnostics.Debug.Fail("P2P packet send fail (flush)"); } } m_pendingFlushes.Clear(); int totalSum = 0; NetProfiler.Begin("Avg per frame (60 frames window)"); for (int i = 0; i < MessageTypeCount; i++) { var window = m_slidingWindows[i]; window.Enqueue(m_thisFrameTraffic[i]); m_thisFrameTraffic[i] = 0; while (window.Count > 60) { window.Dequeue(); } int sum = 0; foreach (var item in window) { sum += item; } if (sum > 0) { NetProfiler.Begin(MyEnum <MyMessageId> .GetName((MyMessageId)i)); NetProfiler.End(sum / 60.0f, sum / 1024.0f, "{0} KB/s"); } totalSum += sum; } NetProfiler.End(totalSum / 60.0f, totalSum / 1024.0f, "{0} KB/s"); }
private void SendVoice(ulong user, byte[] data, uint dataSize) { Peer2Peer.SendPacket(user, data, (int)dataSize, P2PMessageEnum.UnreliableNoDelay, MyMultiplayer.VoiceChatChannel); }