예제 #1
0
 public void Put(float value)
 {
     if (_autoResize)
     {
         ResizeIfNeed(_position + 4);
     }
     FastBitConverter.GetBytes(_data, _position, value);
     _position += 4;
 }
예제 #2
0
        public static NetPacket Make(long connectId, byte connectNum, bool reusedPeer)
        {
            var packet = new NetPacket(PacketProperty.ConnectAccept, 0);

            FastBitConverter.GetBytes(packet.RawData, 1, connectId);
            packet.RawData[9]  = connectNum;
            packet.RawData[10] = (byte)(reusedPeer ? 1 : 0);
            return(packet);
        }
예제 #3
0
 public void Put(short value)
 {
     if (_autoResize)
     {
         ResizeIfNeed(_position + 2);
     }
     FastBitConverter.GetBytes(_data, _position, value);
     _position += 2;
 }
예제 #4
0
 public void Put(ulong value)
 {
     if (_autoResize)
     {
         ResizeIfNeed(_position + 8);
     }
     FastBitConverter.GetBytes(_data, _position, value);
     _position += 8;
 }
예제 #5
0
        public static NetPacket MakeNetworkChanged(NetPeer peer)
        {
            var packet = new NetPacket(PacketProperty.PeerNotFound, Size - 1);

            FastBitConverter.GetBytes(packet.RawData, 1, peer.ConnectTime);
            packet.RawData[9]  = peer.ConnectionNum;
            packet.RawData[10] = 1;
            FastBitConverter.GetBytes(packet.RawData, 11, peer.RemoteId);
            return(packet);
        }
예제 #6
0
        private static byte[] GetTestPacketWithCrc()
        {
            byte[] testMsg = GetTestMessageBytes();
            uint   crc32   = CRC32C.Compute(testMsg, 0, testMsg.Length);

            byte[] packet = new byte[testMsg.Length + CRC32C.ChecksumSize];
            Buffer.BlockCopy(testMsg, 0, packet, 0, testMsg.Length);
            FastBitConverter.GetBytes(packet, testMsg.Length, crc32);
            return(packet);
        }
예제 #7
0
 public void PutBytesWithLength(byte[] data)
 {
     if (_autoResize)
     {
         ResizeIfNeed(_position + data.Length + 4);
     }
     FastBitConverter.GetBytes(_data, _position, data.Length);
     Buffer.BlockCopy(data, 0, _data, _position + 4, data.Length);
     _position += data.Length + 4;
 }
예제 #8
0
 public void PutBytesWithLength(byte[] data, int offset, int length)
 {
     if (_autoResize)
     {
         ResizeIfNeed(_position + length + 4);
     }
     FastBitConverter.GetBytes(_data, _position, length);
     Buffer.BlockCopy(data, offset, _data, _position + 4, length);
     _position += length + 4;
 }
예제 #9
0
        public static NetPacket Make(NetDataWriter connectData, long connectId)
        {
            //Make initial packet
            var packet = new NetPacket(PacketProperty.ConnectRequest, connectData.Length);

            //Add data
            FastBitConverter.GetBytes(packet.RawData, 1, NetConstants.ProtocolId);
            FastBitConverter.GetBytes(packet.RawData, 5, connectId);
            Buffer.BlockCopy(connectData.Data, 0, packet.RawData, HeaderSize, connectData.Length);
            return(packet);
        }
예제 #10
0
        public void OnSend(IMessageContext context, ref List <ArraySegment <byte> > lists, ArraySegment <byte> payload)
        {
            // 헤더 만들어 넣고
            byte[] header = context.BufferManager.Take(SimpleBinaryMessageProtocol.HEADERSIZE);
            FastBitConverter.GetBytes(payload.Count, header, 0);
            lists.Add(new ArraySegment <byte>(header, 0, SimpleBinaryMessageProtocol.HEADERSIZE));

            // payload 적재하고
            byte[] copyPayload = context.BufferManager.Take(payload.Count);
            Array.Copy(payload.Array, payload.Offset, copyPayload, 0, payload.Count);
            lists.Add(new ArraySegment <byte>(copyPayload, 0, payload.Count));
        }
예제 #11
0
        private void SendConnectRequest()
        {
            //Make initial packet
            var connectPacket = _packetPool.Get(PacketProperty.ConnectRequest, 12 + _connectData.Length);

            //Add data
            FastBitConverter.GetBytes(connectPacket.RawData, 1, NetConstants.ProtocolId);
            FastBitConverter.GetBytes(connectPacket.RawData, 5, _connectId);
            Buffer.BlockCopy(_connectData.Data, 0, connectPacket.RawData, 13, _connectData.Length);

            //Send raw
            _netManager.SendRawAndRecycle(connectPacket, _remoteEndPoint);
        }
예제 #12
0
        private void SendConnectAccept(NetPeer peer, ulong id)
        {
            //Reset connection timer
            peer.StartConnectionTimer();

            //Make initial packet
            var connectPacket = NetPacket.CreateRawPacket(PacketProperty.ConnectAccept, 8);

            //Add data
            FastBitConverter.GetBytes(connectPacket, 1, id);

            //Send raw
            SendRaw(connectPacket, peer.EndPoint);
        }
예제 #13
0
        private void SendConnectAccept()
        {
            //Reset connection timer
            _timeSinceLastPacket = 0;

            //Make initial packet
            var connectPacket = _packetPool.Get(PacketProperty.ConnectAccept, 0, sizeof(long)); // sizeof(_connectId)

            //Add data
            FastBitConverter.GetBytes(connectPacket.RawData, 0, _connectId);

            //Send raw
            _netManager.SendRawAndRecycle(connectPacket, _remoteEndPoint);
        }
예제 #14
0
        private void SendConnectAccept()
        {
            //Reset connection timer
            _timeSinceLastPacket = 0;

            //Make initial packet
            var connectPacket = _packetPool.GetWithProperty(PacketProperty.ConnectAccept, 8);

            //Add data
            FastBitConverter.GetBytes(connectPacket.RawData, NetConstants.AcceptConnectIdIndex, _connectId);

            //Send raw
            _netManager.SendRawAndRecycle(connectPacket, _remoteEndPoint);
        }
예제 #15
0
        private void SendConnectAccept()
        {
            //Reset connection timer
            _timeSinceLastPacket = 0;

            //Make initial packet
            var connectPacket = _packetPool.Get(PacketProperty.ConnectAccept, 8);

            //Add data
            FastBitConverter.GetBytes(connectPacket.RawData, 1, _connectId);

            //Send raw
            _peerListener.SendRawAndRecycle(connectPacket, _remoteEndPoint);
        }
예제 #16
0
        private void SendConnectAccept()
        {
            //Reset connection timer
            _lastPacketReceivedStart = DateTime.UtcNow;

            //Make initial packet
            var connectPacket = NetPacket.CreateRawPacket(PacketProperty.ConnectAccept, 8);

            //Add data
            FastBitConverter.GetBytes(connectPacket, 1, _connectId);

            //Send raw
            _peerListener.SendRaw(connectPacket, _remoteEndPoint);
        }
예제 #17
0
        private void SendConnectRequest()
        {
            //Get connect key bytes
            byte[] keyData = Encoding.UTF8.GetBytes(_connectKey);

            //Make initial packet
            var connectPacket = NetPacket.CreateRawPacket(PacketProperty.ConnectRequest, 8 + keyData.Length);

            //Add data
            FastBitConverter.GetBytes(connectPacket, 1, _connectId);
            Buffer.BlockCopy(keyData, 0, connectPacket, 9, keyData.Length);

            //Send raw
            _peer.SendRawData(connectPacket);
        }
예제 #18
0
 private void CloseConnection(bool force)
 {
     if (_peer != null && !force)
     {
         //Send disconnect data
         var disconnectPacket = NetPacket.CreateRawPacket(PacketProperty.Disconnect, 8);
         FastBitConverter.GetBytes(disconnectPacket, 1, _connectId);
         _peer.SendRawData(disconnectPacket);
     }
     _peer            = null;
     _connected       = false;
     _connectTimer    = 0;
     _connectAttempts = 0;
     SocketClearPeers();
 }
예제 #19
0
        private void SendConnectRequest()
        {
            //Get connect key bytes
            byte[] keyData = Encoding.UTF8.GetBytes(_peerListener.ConnectKey);

            //Make initial packet
            var connectPacket = _packetPool.Get(PacketProperty.ConnectRequest, 12 + keyData.Length);

            //Add data
            FastBitConverter.GetBytes(connectPacket.RawData, 1, NetConstants.ProtocolId);
            FastBitConverter.GetBytes(connectPacket.RawData, 5, _connectId);
            Buffer.BlockCopy(keyData, 0, connectPacket.RawData, 13, keyData.Length);

            //Send raw
            _peerListener.SendRawAndRecycle(connectPacket, _remoteEndPoint);
        }
예제 #20
0
    private void PutArray(Array arr, int sz)
    {
        ushort length = arr == null ? (ushort)0 : (ushort)arr.Length;

        sz *= length;
        if (_autoResize)
        {
            ResizeIfNeed(_position + sz + 2);
        }
        FastBitConverter.GetBytes(_data, _position, length);
        if (arr != null)
        {
            Buffer.BlockCopy(arr, 0, _data, _position + 2, sz);
        }
        _position += sz + 2;
    }
예제 #21
0
        public static NetPacket Make(NetDataWriter connectData, SocketAddress addressBytes, long connectId)
        {
            //Make initial packet
            var packet = new NetPacket(PacketProperty.ConnectRequest, connectData.Length + addressBytes.Size);

            //Add data
            FastBitConverter.GetBytes(packet.RawData, 1, NetConstants.ProtocolId);
            FastBitConverter.GetBytes(packet.RawData, 5, connectId);
            packet.RawData[13] = (byte)addressBytes.Size;
            for (int i = 0; i < addressBytes.Size; i++)
            {
                packet.RawData[14 + i] = addressBytes[i];
            }
            Buffer.BlockCopy(connectData.Data, 0, packet.RawData, 14 + addressBytes.Size, connectData.Length);
            return(packet);
        }
예제 #22
0
        internal ShutdownResult Shutdown(byte[] data, int start, int length, bool force)
        {
            lock (_shutdownLock)
            {
                //trying to shutdown already disconnected
                if (_connectionState == ConnectionState.Disconnected ||
                    _connectionState == ConnectionState.ShutdownRequested)
                {
                    return(ShutdownResult.None);
                }

                var result = _connectionState == ConnectionState.Connected
                    ? ShutdownResult.WasConnected
                    : ShutdownResult.Success;

                //don't send anything
                if (force)
                {
                    _connectionState = ConnectionState.Disconnected;
                    return(result);
                }

                //reset time for reconnect protection
                Interlocked.Exchange(ref _timeSinceLastPacket, 0);

                //send shutdown packet
                _shutdownPacket = new NetPacket(PacketProperty.Disconnect, length)
                {
                    ConnectionNumber = _connectNum
                };
                FastBitConverter.GetBytes(_shutdownPacket.RawData, 1, _connectTime);
                if (_shutdownPacket.Size >= _mtu)
                {
                    //Drop additional data
                    NetDebug.WriteError("[Peer] Disconnect additional data size more than MTU - 8!");
                }
                else if (data != null && length > 0)
                {
                    Buffer.BlockCopy(data, start, _shutdownPacket.RawData, 9, length);
                }
                _connectionState = ConnectionState.ShutdownRequested;
                NetDebug.Write("[Peer] Send disconnect");
                NetManager.SendRaw(_shutdownPacket, EndPoint);
                return(result);
            }
        }
예제 #23
0
        internal void SendShutdownPacket()
        {
            NetPacket _shutdownPacket = _packetPool.Get(PacketProperty.Disconnect, 0, sizeof(long) + _shutdownData.Length);

            FastBitConverter.GetBytes(_shutdownPacket.RawData, 0, _connectId);
            if (_shutdownData.Length + sizeof(long) >= _mtu)
            {
                //Drop additional data
                NetUtils.DebugWriteError("[Peer] Disconnect additional data size more than MTU - 8!");
            }
            else if (_shutdownData != null && _shutdownData.Length > 0)
            {
                Buffer.BlockCopy(_shutdownData, 0, _shutdownPacket.RawData, sizeof(long), _shutdownData.Length);
            }
            _connectionState = ConnectionState.ShutdownRequested;
            SendRawData(_shutdownPacket);
        }
예제 #24
0
        internal void FlushMergePacket()
        {
            //If merging enabled
            if (_mergePos > 0)
            {
                if (_mergeCount > 1)
                {
                    // build the mergeData
                    NetPacket _mergeData = _packetPool.Get(PacketProperty.Merged, 0, _mergePos);
                    _mergePos   = 0;
                    _mergeCount = 0;
                    while (_mergedPackets.Empty == false)
                    {
                        _mergeCount++;
                        NetPacket packet = _mergedPackets.Dequeue();
                        FastBitConverter.GetBytes(_mergeData.RawData, _mergePos, (ushort)packet.Size);
                        Buffer.BlockCopy(packet.RawData, 0, _mergeData.RawData, _mergePos + sizeof(ushort), packet.Size);
                        _mergePos += packet.Size + sizeof(ushort);
                        packet.Recycle();
                    }
                    if (_mergeCount > 0)
                    {
                        NetUtils.DebugWrite("Send merged: " + _mergePos + ", count: " + _mergeCount);
                        _mergeData.Size     = NetPacket.GetHeaderSize(PacketProperty.Merged) + _mergePos;
                        _mergeData.Property = PacketProperty.Merged;
                        _netManager.SendRawAndRecycle(_mergeData, _remoteEndPoint);
                    }
#if STATS_ENABLED
                    Statistics.PacketsSent++;
                    Statistics.BytesSent += (ulong)(NetConstants.HeaderSize + _mergePos);
#endif
                }
                else
                {
                    NetPacket packet = _mergedPackets.Dequeue();
                    //Send without length information and merging
                    _netManager.SendRawAndRecycle(packet, _remoteEndPoint);
#if STATS_ENABLED
                    Statistics.PacketsSent++;
                    Statistics.BytesSent += (ulong)(_mergePos - 2);
#endif
                }
                _mergePos   = 0;
                _mergeCount = 0;
            }
        }
예제 #25
0
        internal void SendRawData(byte[] data)
        {
            //2 - merge byte + minimal packet size + datalen(ushort)
            if (_peerListener.MergeEnabled && _mergePos + data.Length + NetConstants.HeaderSize * 2 + 2 < _mtu)
            {
                FastBitConverter.GetBytes(_mergeData.RawData, _mergePos + NetConstants.HeaderSize, (ushort)data.Length);
                Buffer.BlockCopy(data, 0, _mergeData.RawData, _mergePos + NetConstants.HeaderSize + 2, data.Length);
                _mergePos += data.Length + 2;
                _mergeCount++;

                //DebugWriteForce("Merged: " + _mergePos + "/" + (_mtu - 2) + ", count: " + _mergeCount);
            }
            else
            {
                _peerListener.SendRaw(data, 0, data.Length, _remoteEndPoint);
            }
        }
예제 #26
0
        public static NetPacket Make(long connectId, byte connectNum, bool reusedPeer, byte[] acceptData = null)
        {
            var dataSize = acceptData?.Length ?? 0;

            // Make initial packet
            var packet = new NetPacket(PacketProperty.ConnectAccept, dataSize);

            // Add data
            FastBitConverter.GetBytes(packet.RawData, 1, connectId);
            packet.RawData[9]  = connectNum;
            packet.RawData[10] = (byte)(reusedPeer ? 1 : 0);

            if (acceptData != null && dataSize > 0)
            {
                Buffer.BlockCopy(acceptData, 0, packet.RawData, Size, acceptData.Length);
            }

            return(packet);
        }
예제 #27
0
        //Connect constructor
        internal NetPeer(NetManager netManager, IPEndPoint remoteEndPoint, NetDataWriter connectData) : this(netManager, remoteEndPoint)
        {
            _connectAttempts = 0;
            _connectId       = DateTime.UtcNow.Ticks;
            _connectionState = ConnectionState.InProgress;

            //Make initial packet
            _connectRequestPacket = new NetPacket(PacketProperty.ConnectRequest, 12 + connectData.Length);

            //Add data
            FastBitConverter.GetBytes(_connectRequestPacket.RawData, 1, NetConstants.ProtocolId);
            FastBitConverter.GetBytes(_connectRequestPacket.RawData, 5, _connectId);
            Buffer.BlockCopy(connectData.Data, 0, _connectRequestPacket.RawData, 13, connectData.Length);

            //Send request
            _netManager.SendRaw(_connectRequestPacket, _remoteEndPoint);

            NetUtils.DebugWrite(ConsoleColor.Cyan, "[CC] ConnectId: {0}", _connectId);
        }
예제 #28
0
        internal void SendRawData(NetPacket packet)
        {
            //2 - merge byte + minimal packet size + datalen(ushort)
            if (_peerListener.MergeEnabled &&
                CanMerge(packet.Property) &&
                _mergePos + packet.Size + NetConstants.HeaderSize * 2 + 2 < _mtu)
            {
                FastBitConverter.GetBytes(_mergeData.RawData, _mergePos + NetConstants.HeaderSize, (ushort)packet.Size);
                Buffer.BlockCopy(packet.RawData, 0, _mergeData.RawData, _mergePos + NetConstants.HeaderSize + 2, packet.Size);
                _mergePos += packet.Size + 2;
                _mergeCount++;

                //DebugWriteForce("Merged: " + _mergePos + "/" + (_mtu - 2) + ", count: " + _mergeCount);
                return;
            }

            NetUtils.DebugWrite(ConsoleColor.DarkYellow, "[P]SendingPacket: " + packet.Property);
            _peerListener.SendRaw(packet.RawData, 0, packet.Size, _remoteEndPoint);
        }
예제 #29
0
        private void UpdateMtuLogic(int deltaTime)
        {
            if (_finishMtu)
            {
                return;
            }

            _mtuCheckTimer += deltaTime;
            if (_mtuCheckTimer < MtuCheckDelay)
            {
                return;
            }

            _mtuCheckTimer = 0;
            _mtuCheckAttempts++;
            if (_mtuCheckAttempts >= MaxMtuCheckAttempts)
            {
                _finishMtu = true;
                return;
            }

            lock (_mtuMutex)
            {
                if (_mtuIdx >= NetConstants.PossibleMtu.Length - 1)
                {
                    return;
                }

                //Send increased packet
                int newMtu = NetConstants.PossibleMtu[_mtuIdx + 1];
                var p      = _packetPool.GetPacket(newMtu);
                p.Property = PacketProperty.MtuCheck;
                FastBitConverter.GetBytes(p.RawData, 1, newMtu);          //place into start
                FastBitConverter.GetBytes(p.RawData, p.Size - 4, newMtu); //and end of packet

                //Must check result for MTU fix
                if (NetManager.SendRawAndRecycle(p, EndPoint) <= 0)
                {
                    _finishMtu = true;
                }
            }
        }
예제 #30
0
        /// <summary>
        /// Force closes connection and stop all threads.
        /// </summary>
        public void Stop()
        {
            //Send disconnect packets
            lock (_peers)
                foreach (NetPeer netPeer in _peers.Values)
                {
                    var disconnectPacket = NetPacket.CreateRawPacket(PacketProperty.Disconnect, 8);
                    FastBitConverter.GetBytes(disconnectPacket, 1, netPeer.ConnectId);
                    SendRaw(disconnectPacket, netPeer.EndPoint);
                }

            //Clear
            ClearPeers();

            //Stop
            if (IsRunning)
            {
                _logicThread.Stop();
                _socket.Close();
            }
        }