Esempio n. 1
0
        public ClientPacket(byte[] data)
        {
            data = NetworkSyntheticTesting.SyntheticCorruption_C2S(data);

            ParsePacketData(data);
            if (IsValid)
            {
                ReadFragments();
            }
        }
Esempio n. 2
0
        private void SendPacketRaw(ServerPacket packet)
        {
            byte[] buffer = ArrayPool <byte> .Shared.Rent((int)(PacketHeader.HeaderSize + (packet.Data?.Length ?? 0) + (packet.Fragments.Count *PacketFragment.MaxFragementSize)));

            try
            {
                var socket = connectionListener.Socket;

                packet.CreateReadyToSendPacket(buffer, out var size);

                packetLog.Debug(packet.ToString());

                buffer = NetworkSyntheticTesting.SyntheticCorruption_S2C(buffer);

                if (packetLog.IsDebugEnabled)
                {
                    var listenerEndpoint = (System.Net.IPEndPoint)socket.LocalEndPoint;
                    var sb = new StringBuilder();
                    sb.AppendLine(String.Format("[{5}] Sending Packet (Len: {0}) [{1}:{2}=>{3}:{4}]", buffer.Length, listenerEndpoint.Address, listenerEndpoint.Port, session.EndPoint.Address, session.EndPoint.Port, session.Network.ClientId));
                    sb.AppendLine(buffer.BuildPacketString());
                    packetLog.Debug(sb.ToString());
                }

                try
                {
                    socket.SendTo(buffer, size, SocketFlags.None, session.EndPoint);
                }
                catch (SocketException ex)
                {
                    // Unhandled Exception: System.Net.Sockets.SocketException: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself
                    // at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)
                    // at System.Net.Sockets.Socket.SendTo(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint remoteEP)

                    var listenerEndpoint = (System.Net.IPEndPoint)socket.LocalEndPoint;
                    var sb = new StringBuilder();
                    sb.AppendLine(ex.ToString());
                    sb.AppendLine(String.Format("[{5}] Sending Packet (Len: {0}) [{1}:{2}=>{3}:{4}]", buffer.Length, listenerEndpoint.Address, listenerEndpoint.Port, session.EndPoint.Address, session.EndPoint.Port, session.Network.ClientId));
                    log.Error(sb.ToString());

                    session.Terminate(SessionTerminationReason.SendToSocketException, null, null, ex.Message);
                }
            }
            finally
            {
                ArrayPool <byte> .Shared.Return(buffer, true);
            }
        }
Esempio n. 3
0
        public bool Unpack(byte[] data)
        {
            try
            {
                // This won't actually do anything by default unless some bools in NetworkSyntheticTesting are enabled manually
                data = NetworkSyntheticTesting.SyntheticCorruption_C2S(data);

                if (data.Length < PacketHeader.HeaderSize)
                {
                    return(false);
                }

                Header.Unpack(data);

                if (Header.Size > data.Length - PacketHeader.HeaderSize)
                {
                    return(false);
                }

                Data       = new MemoryStream(data, PacketHeader.HeaderSize, Header.Size, false, true);
                DataReader = new BinaryReader(Data);
                HeaderOptional.Unpack(DataReader, Header);

                if (!HeaderOptional.IsValid)
                {
                    return(false);
                }

                if (!ReadFragments())
                {
                    return(false);
                }

                return(true);
            }
            catch (Exception ex)
            {
                packetLog.Error("Invalid packet data", ex);

                return(false);
            }
        }
Esempio n. 4
0
        private void SendPacketRaw(ServerPacket packet)
        {
            Socket socket = SocketManager.GetMainSocket();

            byte[] payload = packet.GetPayload();

#if NETDIAG
            payload = NetworkSyntheticTesting.SyntheticCorruption_S2C(payload);
#endif

            if (packetLog.IsDebugEnabled)
            {
                var listenerEndpoint = (System.Net.IPEndPoint)socket.LocalEndPoint;
                var sb = new StringBuilder();
                sb.AppendLine(String.Format("[{5}] Sending Packet (Len: {0}) [{1}:{2}=>{3}:{4}]", payload.Length, listenerEndpoint.Address, listenerEndpoint.Port, session.EndPoint.Address, session.EndPoint.Port, session.Network.ClientId));
                sb.AppendLine(payload.BuildPacketString());
                packetLog.Debug(sb.ToString());
            }

            try
            {
                socket.SendTo(payload, session.EndPoint);
            }
            catch (SocketException ex)
            {
                // Unhandled Exception: System.Net.Sockets.SocketException: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself
                // at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)
                // at System.Net.Sockets.Socket.SendTo(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint remoteEP)

                var listenerEndpoint = (System.Net.IPEndPoint)socket.LocalEndPoint;
                var sb = new StringBuilder();
                sb.AppendLine(ex.ToString());
                sb.AppendLine(String.Format("[{5}] Sending Packet (Len: {0}) [{1}:{2}=>{3}:{4}]", payload.Length, listenerEndpoint.Address, listenerEndpoint.Port, session.EndPoint.Address, session.EndPoint.Port, session.Network.ClientId));
                log.Error(sb.ToString());

                session.State = Enum.SessionState.NetworkTimeout; // This will force WorldManager to drop the session
            }
        }