Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 4
0
 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");
     }
 }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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");
            }
        }
Exemplo n.º 8
0
        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");
        }
Exemplo n.º 9
0
 private void SendVoice(ulong user, byte[] data, uint dataSize)
 {
     Peer2Peer.SendPacket(user, data, (int)dataSize, P2PMessageEnum.UnreliableNoDelay, MyMultiplayer.VoiceChatChannel);
 }